升级的FileHelpers库,现在我的代码已经过时了

时间:2010-11-19 01:45:53

标签: c# generics reflection 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,使用原始反射代码不起作用。

更新:在尝试了Paul的代码之后,我现在需要能够访问FileHelpers类中的方法或其他内容,例如(此部分无法编译)

fileHelperEngine.ErrorManager.ErrorMode = ErrorMode.SaveAndContinue;

importData = fileHelperEngine.ReadFileAsDT(filepath);

但我并不清楚实际发生了什么。任何更好地理解泛型概念的链接也将受到赞赏。

2 个答案:

答案 0 :(得分: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);

不幸的是,不可能将生成的对象直接转换为泛型类型,c#不实现duck typing。

我想你有两个选择,使用接口或基类并强制转换,fileHelperEngine不实现任何接口,基类也没有任何有用的方法,所以这没用。如果许可证允许,您可以更改代码并实施一个代码。

另一种选择是测试类型,这是hacky,但如果可能性列表很小,则可以,例如:

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

答案 1 :(得分:1)

Breadtruck

我昨天用[Obsolote]属性提交了更改,实际上是检查下一个版本的lib的一些示例,但现在已被删除。

你可以进行SVN更新并重新编译以避免警告,对不起问题:(

马科斯