Обновлена ​​библиотека FileHelpers, и теперь мой код устарел

Я использую отражение, чтобы динамически указывать имя класса, когда я импортирую файлы с помощью 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);

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


person Breadtruck    schedule 19.11.2010    source источник


Ответы (2)


Хлебовоз

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

Вы можете сделать обновление SVN и перекомпилировать его, чтобы избежать предупреждения, извините за проблемы :(

Маркос

person Marcos Meli    schedule 19.11.2010
comment
Я все еще мог использовать свой старый код, нужно было просто понять и исправить его, прежде чем он перестал работать. Я полагаю, я могу продолжать получать артефакты из TeamCity? Кстати, отличная работа, помогает мне делать то, что мне нужно :) - person Breadtruck; 19.11.2010
comment
Вам не нужно ничего менять в вашем коде, потому что он идеален. Я настоятельно рекомендую вам загрузить стабильную ветку вместо основной, потому что вы можете поймать ошибку, мы используем стабильную ветку на моей работе без проблем. Например, сегодня мы заканчиваем сборку версией для .net 2.0 и 4.0, чтобы избежать проблем, мы также думаем предоставить сборки для AnyCpu/x86/x64 из-за возможных проблем, которые есть у Visual Studio. - person Marcos Meli; 20.11.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>;

так далее

person Paul Creasey    schedule 19.11.2010
comment
Итак, на данный момент я вставил ваш код, но как мне получить доступ к методам в FileHelperClass? - person Breadtruck; 19.11.2010
comment
Меня смущает утверждение, что FileHelperEngine не реализует никаких интерфейсов, а его базовый класс не имеет полезных методов? Из документов ..... открытый класс FileHelperEngine‹T›: EventEngineBase‹T›, IFileHelperEngine‹T›, где T: класс.... Разве IFileHelperEngine не означает, что у него есть интерфейс? - person Breadtruck; 19.11.2010
comment
Может быть, я смотрю на что-то другое, но я скачал код для файловых помощников v2, чтобы посмотреть, и он определен как public class FileHelperEngine<T>: EngineBase, где EngineBase является абстрактным. - person Paul Creasey; 19.11.2010
comment
Я загрузил артефакты 2.9.9 build818 с teamcity.codebetter.com, поэтому я искал файл chm, а не копался в самом коде, так что вы можете быть правы. - person Breadtruck; 19.11.2010