当我使用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);
但我并不清楚实际发生了什么。任何更好地理解泛型概念的链接也将受到赞赏。
答案 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更新并重新编译以避免警告,对不起问题:(
马科斯