Обновлена ​​библиотека FileHelpers, и теперь мой код устарел - PullRequest
0 голосов
/ 19 ноября 2010

Я использую отражение, чтобы динамически указывать имя класса, когда я выполняю импорт файлов с помощью FileHelpers, как это ...

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

После получения последней версии библиотеки то, что я делал выше, теперь считается "устаревшим"

Таким образом, реализация была заменена на дженерики

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

но я не уверен, как динамически указывать myImportDefintionClass во время выполнения, использование исходного кода отражения не работает.

ОБНОВЛЕНИЕ: После того, как я попробовал код Пола, мне теперь нужно было бы получить доступ к методам или к чему-либо внутри класса FileHelpers, например (эта часть не компилируется)

fileHelperEngine.ErrorManager.ErrorMode = ErrorMode.SaveAndContinue;

importData = fileHelperEngine.ReadFileAsDT(filepath);

Но мне не совсем понятно, что на самом деле происходит. Любые ссылки для лучшего понимания общих понятий также приветствуются.

Ответы [ 2 ]

2 голосов
/ 19 ноября 2010
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);

К сожалению, невозможно привести приведенный объект непосредственно к универсальному типу, в c # не реализована утка.

Я полагаю, у вас есть две опции: используйте интерфейс или базовый класс и приведите к нему, fileHelperEngine не реализует никаких интерфейсов и не имеет базовых классов каких-либо полезных методов, так что это не полезно. Вы можете изменить код и внедрить его, если лицензия позволяет.

Другой вариант - проверить тип, это хакерство, но хорошо, если список возможностей мал, например:

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

и т.д.

1 голос
/ 19 ноября 2010

Breadtruck

Я зафиксировал изменения с атрибутом [Obsolote] вчера, фактически проверял некоторые примеры библиотеки для следующего выпуска, но сейчас они удалены.выполните обновление SVN и перекомпилируйте его, чтобы избежать предупреждения, извините за проблемы: (

Marcos

...