2015-10-27 37 views
1

我正在尝试使用泛型类型创建FileHelperEngine的一个实例> <>。例如,这适用于名单从类型变量创建FileHelperEngine

public static IList CreateList(Type type) 
    { 
     var genericListType = typeof(List<>).MakeGenericType(type); 
     return (IList)Activator.CreateInstance(genericListType); 
    } 

是否有可能做FileHelperEngine <类似的东西>?

我试图

public static FileHelperEngine CreateFileHelperEngine(Type type) 
    { 
     var genericFileHelperEngineType = typeof (FileHelperEngine<>).MakeGenericType(type); 
     return (FileHelperEngine)Activator.CreateInstance(genericFileHelperEngineType); 
    } 

而得到这个错误

无法投类型的对象FileHelpers.FileHelperEngine`1 [NachaParser.Model.EntryDetail.PpdEntryModel]为键入 'FileHelpers.FileHelperEngine' 。

回答

3

这是行不通的,因为您试图从通用引擎转到标准引擎。通用引擎不会从标准引擎继承,因此您无法直接投射。

下面的代码应该为你工作:

public static FileHelperEngine<T> CreateFileHelperEngine<T>() where T : class 
    { 
     var genericFileHelperEngineType = typeof(FileHelperEngine<>).MakeGenericType(typeof(T)); 
     return (FileHelperEngine<T>)Activator.CreateInstance(genericFileHelperEngineType); 
    } 

的问题是,你需要有T的类型不是一个类型变量而是作为一个通过一般的参数。不幸的是,通用引擎基于EngineBase<T>IFileHelperEngine<T>作为它实现的接口,所以您永远不会得到FileHelperEngine<T>FileHelperEngine

你唯一的选择就是使用:

public static FileHelperEngine CreateFileHelperEngine(Type type) 
    { 
     if (!type.IsClass) 
      throw new InvalidCastException("Cannot use '" + type.FullName + "' as it is not a class"); 

     return new FileHelperEngine(type); 
    } 
+0

选项2的工作,非常感谢你! – Bleeped