0

当我像这样使用 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);

但我不是很清楚到底发生了什么。任何可以更好地理解泛型概念的链接也将不胜感激。

4

2 回答 2

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# 不实现鸭子类型。

我想您有两个选择,使用接口或基类并将其转换为,fileHelperEngine 不实现任何接口,基类也没有任何有用的方法,因此没有用。如果许可证允许,您可以更改代码并实施。

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

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

ETC

于 2010-11-19T01:54:18.587 回答
1

面包车

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

您可以进行 SVN 更新并重新编译它以避免警告,对问题表示抱歉:(

马科斯

于 2010-11-19T12:25:34.290 回答