我正在尝试创建FileHelperEngine<>的实例使用通用类型。例如,这适用于List
public static IList CreateList(Type type)
{
var genericListType = typeof(List<>).MakeGenericType(type);
return (IList)Activator.CreateInstance(genericListType);
}
是否可以为FileHelperEngine&lt;&gt;做一些类似的事情?
我试过
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'。
答案 0 :(得分:3)
这不起作用,因为您试图从通用引擎转到标准引擎。通用引擎不会继承标准引擎,因此您无法直接转换。
以下代码适合您:
public static FileHelperEngine<T> CreateFileHelperEngine<T>() where T : class
{
var genericFileHelperEngineType = typeof(FileHelperEngine<>).MakeGenericType(typeof(T));
return (FileHelperEngine<T>)Activator.CreateInstance(genericFileHelperEngineType);
}
问题是你需要将T的类型作为Type变量,而不是传递的泛型参数。遗憾的是,通用引擎基于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);
}