2010-11-19 15 views
0

FileHelpers kullanarak böyle bir dosya aktarımı yaparken sınıf adını dinamik olarak belirtmek için yansıma kullanıyorum ...Yükseltilmiş FileHelpers kütüphanesi ve şimdi benim kodum eski

Assembly assembly = Assembly.GetExecutingAssembly(); 
AssemblyName assemblyName = assembly.GetName(); 
Type t = assembly.GetType(assemblyName.Name + ".FileDefinitions." + className); 
FileHelperEngine engine = new FileHelperEngine(t); 

Kütüphanenin en son sürümünü aldıktan sonra, şu an yaptığım şudur: "eski"

Uygulama, bu şekilde

FileHelperEngine<myImportDefinitionClass> = new 
           FileHelperEngine<myImportDefinitionClass>(); 

olarak değiştirilmiştir ancak orijinal yansıma kodu kullanılmadığında myImportDefintionClass'un çalışma zamanında dinamik olarak nasıl belirtileceğinden emin değilim.

GÜNCELLEŞTİRME: Paul'un kodunu denedikten sonra, (xmx41

fileHelperEngine.ErrorManager.ErrorMode = ErrorMode.SaveAndContinue; 

importData = fileHelperEngine.ReadFileAsDT(filepath); 
x gibi) xxxx

gibi xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx aslında neler olup bittiği konusunda net değil. Jenerik kavramlarını daha iyi anlamak için herhangi bir bağlantı da takdir edilecektir.

cevap

1

Breadtruck

Değişiklikleri kararlıdır Dün [Obsolote] özelliği ile, aslında bir sonraki sürüm için lib'in bazı örneklerini kontrol etmekteydi, ancak şimdi kaldırıldı.

Sen bir SVN güncellemesini yapmak ve Marcos

+0

Eski kodumu hala kullanabildim, işe yaramadan önce onu anlamak ve düzeltmek daha önemliydi. Eserleri ekipten çıkarmaya devam edebileceğimi mi tahmin ediyorum? Bu arada harika bir çalışma, bana ihtiyacım olan şeyi yapmamı sağlıyor :) – Breadtruck

+0

Kodunuzun hiçbirini değiştirmenize gerek yok çünkü mükemmel. Bir hatayı yakalayabildiğinizden dolayı, sabit bir şubeyi gövdeye yüklemek yerine güçlü bir şekilde tavsiye ederim. Örneğin, bugün, sorunlardan kaçınmak için .net 2.0 ve 4.0 sürümüyle derlemeyi bitiriyoruz, ayrıca Visual Studio'nun sahip olduğu olası sorunlar nedeniyle AnyCpu/x86/x64 için yapılandırma sağlamayı düşünüyoruz – MarcosMeli

2
Assembly assembly = Assembly.GetExecutingAssembly(); 
AssemblyName assemblyName = assembly.GetName(); 
Type emptyGenericType = typeof(FileHelperEngine<>); 
Type genericTypeArgument = assembly.GetType(assemblyName.Name + ".FileDefinitions." + className); 
Type completeGenericType = emptyGenericType.MakeGenericType(genericTypeArgument); 
var fileHelperEngine = Activator.CreateInstance(completeGenericType); 

Ne yazık ki, genel tipe çıkan nesne doğrudan döküm için, C# ördek yazmaya uygulamıyor mümkün değildir.

Sanırım iki seçeneğiniz var, bir arabirim veya taban sınıfı kullanın ve bunun için yayın yapın, FileHelperEngine herhangi bir arabirimi uygulamıyor ve temel sınıfın yararlı yöntemleri yoktur, bu da kullanışlı değildir. Kodu değiştirebilir ve lisansın uygun olması durumunda uygulayabilirsiniz. olasılıklar listesi küçükse

Diğer seçenek türünü test etmektir, bu hacky, ama Tamam, örneğin:

if (fileHelperEngine is FileHelperEngine<string>) 
    fileHelperEngine = fileHelperEngine as FileHelperEngine<string>; 

vb

+0

problemler :(

için üzgün uyarı, önlemek için yeniden derleyebilirseniz bu noktada kodunuzu koymak ama var Öyleyse size yöntemlerine erişmek nasıl ?.? FileHelperClass içinde – Breadtruck

+0

cevap güncellemek –

+0

Ben açıklamada "FileHelperEngine herhangi arabirimlerini, ne de temel sınıf herhangi kullanışlı yöntemler var yok" dokümanlar karıştı ..... public class FileHelperEngine : EventEngineBase , \t IFileHelperEngine Burada T: sınıf .... IFileHelperEngine bir arabirime sahip olduğu anlamına gelmez mi? – Breadtruck