从Type变量创建FileHelperEngine

时间:2015-10-27 17:52:30

标签: filehelpers

我正在尝试创建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'。

1 个答案:

答案 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);
    }