2010-11-19 5 views
0

j'utiliser la réflexion pour spécifier le nom de la classe dynamique quand je fais l'importation de fichiers en utilisant FileHelpers comme celui-ci ...bibliothèque FileHelpers améliorée et maintenant mon code est obsolète

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

Après avoir obtenu la dernière version de la bibliothèque ce que je a été fait ci-dessus maintenant considéré comme « obsolète »

la mise en œuvre a été modifié aux génériques de cette manière

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

mais je ne suis pas sûr de savoir comment spécifier le myImportDefintionClass dynamiquement à l'exécution, l'utilisation du code de réflexion d'origine ne fonctionne pas.

MISE À JOUR: Après avoir essayé le code de Paul je maintenant besoin d'être en mesure de faire accéder aux méthodes ou tout au sein de la classe FileHelpers tels que (cette partie ne compile pas)

fileHelperEngine.ErrorManager.ErrorMode = ErrorMode.SaveAndContinue; 

importData = fileHelperEngine.ReadFileAsDT(filepath); 

Mais je suis pas vraiment clair sur ce qui se passe réellement. Tout lien permettant de mieux comprendre les concepts génériques serait également apprécié.

Répondre

1

Breadtruck

Je Commité les changements avec l'attribut [Obsolote] hier, en fait était de vérifier quelques exemples de la lib pour la prochaine version, mais sont supprimés maintenant.

Vous pouvez faire une mise à jour SVN et recompiler pour éviter l'avertissement, désolé pour les problèmes :(

Marcos

+0

J'étais encore capable d'utiliser mon ancien code, il s'agissait plus simplement de comprendre et de corriger, avant que ça ne marche pas. Je présume que je peux continuer à retirer les artefacts de l'équipe? Beau travail en passant, m'aide à faire ce dont j'ai besoin :) – Breadtruck

+0

Vous n'avez pas besoin de changer rien de votre code car c'est parfait. Je vous recommande fortement de télécharger la branche Stable au lieu du tronc parce que vous pouvez attraper un bug, nous utilisons la branche stable dans mon travail sans problèmes. Par exemple aujourd'hui nous terminons la construction avec la version pour .net 2.0 et 4.0 pour éviter les problèmes, nous pensons également fournir des builds pour AnyCpu/x86/x64 en raison des problèmes posibles que Visual Studio a – 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); 

Malheureusement, il est impossible de la distribution l'objet résultant directement au type générique, C# ne met pas en œuvre frappe de canard. Je suppose que vous avez deux options, utilisez une interface ou une classe de base et cast, fileHelperEngine n'implémente aucune interface, et la classe de base n'a aucune méthode utile, ce qui n'est pas utile. Vous pouvez changer le code et en implémenter un si la licence le permet.

L'autre option est de tester le type, c'est hacky, mais ok si la liste des possibilités est faible, par exemple:

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

etc

+0

Donc, à ce stade, j'ai mis votre code, mais comment pourrais-je accéder ensuite les méthodes dans la FileHelperClass? – Breadtruck

+0

mettre à jour la réponse –

+0

Je suis confus par la déclaration "FileHelperEngine n'implémente pas d'interfaces, et sa classe de base n'a pas de méthodes utiles"? De la docs ..... public class FileHelperEngine : EventEngineBase , \t IFileHelperEngine où T: classe .... IFileHelperEngine ne signifie-t-il pas qu'il a une interface? – Breadtruck

Questions connexes