从 Type 变量创建 FileHelperEngine

Create FileHelperEngine from Type variable

我正在尝试使用通用类型创建 FileHelperEngine<> 的实例。例如,这适用于 List

    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'。

这是行不通的,因为您正试图从通用引擎转到标准引擎。通用引擎不继承标准引擎,所以你不能直接转换。

以下代码应该适合您:

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