简体   繁体   English

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

[英]How to assign class type to generic Type <T>?

I have a class to execute particular logic as below:我有一个类来执行特定的逻辑如下:

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

Now I want to call this method with a Class as parameter.现在我想用一个类作为参数来调用这个方法。 I have Type object for the class.我有该类的 Type 对象。 How do I assign while calling?通话时如何分配?

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?
        }

You can use MakeGenericMethod something like:您可以使用MakeGenericMethod类似的东西:

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

See: How do I use reflection to call a generic method?请参阅: 如何使用反射来调用泛型方法?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM