如何将类类型分配给泛型类型<T>?

Posted

技术标签:

【中文标题】如何将类类型分配给泛型类型<T>?【英文标题】:How to assign class type to generic Type <T>? 【发布时间】:2021-11-01 21:03:54 【问题描述】:

我有一个类来执行特定的逻辑如下:

public abstract class BaseSchema<T> : iMyInterface
    
        public List<T> GetSchemaObjects<T>(string csvData) where T : iMyInterface
        
            var records = new List<T>();
            using (var streamReader = new StreamReader(csvData))
            
                using (var csvReader = new CsvReader(streamReader, CultureInfo.InvariantCulture))
                
                    records = csvReader.GetRecords<T>().ToList();
                
            
            return records;
        
    

现在我想用一个类作为参数来调用这个方法。我有该类的 Type 对象。调用时如何分配?

public List<T> GetTestSchema<T>(string versionNumber, string schemaName) where T : iMyInterface
        
Type[] allSchemaTypes = Assembly.GetExecutingAssembly().GetTypes()
                                .Where(t => t.IsClass && t.Namespace.StartsWith($"schemaNamespace") 
                                        && !t.GetCustomAttributes(typeof(ObsoleteAttribute), true).Any())
                                .ToArray();            
int indexNumber = GetIndexNumberOfRequiredVersion(versionNumber);
            Type schemaType = allSchemaTypes
                                .Skip(indexNumber)
                                .Where(x => x.Name.Equals(schemaName) && interfaceType.IsAssignableFrom(x))
                                .FirstOrDefault();
            var objj = (iMyInterface)schemaType.Assembly.CreateInstance(schemaType.ToString());
            //Type objjType = Type.GetType(objj);
            return objj.GetSchemaObjects<schemaType>(@"CSV Path"); // This line gives an error as Cannot implicitly convert type List<schemaType> to List<T> but generic should accept it. Isn't it?
        

【问题讨论】:

对于初学者,从那里获取ToList() 并将返回类型更改为IEnumerable&lt;T&gt;。如果你真的需要一个列表(通常你不需要,并且没有它你可以提高内存使用),你可以随时在方法调用站点添加 ToList()。 这能回答你的问题吗? How do I use reflection to call a generic method? 【参考方案1】:

您可以使用MakeGenericMethod 类似:

MethodInfo getSchemaObjectsMethod = typeof(iMyInterface).GetMethod("GetSchemaObjects");
MethodInfo getSchemaObjectsGeneric = getSchemaObjectsMethod.MakeGenericMethod(schemaType);
return getSchemaObjectsGeneric.Invoke(null, new object[]  "CSV Path" );

见:How do I use reflection to call a generic method?

【讨论】:

以上是关于如何将类类型分配给泛型类型<T>?的主要内容,如果未能解决你的问题,请参考以下文章

为啥类型不能分配给泛型类型

使用类型泛型时如何正确地将类转换为抽象类?

使用通配符增强泛型

Swift:将类型从属性传递给泛型函数

从头认识java-13.11 对照数组与泛型容器,观察类型擦除给泛型容器带来什么问题?

带有约束的打字稿泛型不能分配给泛型接口