从字符串动态传递类的类型作为泛型类型

时间:2018-06-15 12:15:43

标签: c#

如果我有多个类,如A类,B类,C类等等。

我希望将此作为泛型类型传递给基于字符串变量值的列表,如果字符串是" A",则传递类A,如果它是" B"然后是B类等等(没有条件检查,因为字符串的值没有决定)。

因此,如果存在一个值为" A"的字符串变量,那么该类的类型应该如下传递。

IEnumerable<A> obj = SomeClassObj.GetData<A>(); //Here, need to add type of class A

那么实现这个目标的方法是什么?

1 个答案:

答案 0 :(得分:1)

你必须利用反射来做这样的事情,试试下面的代码

    object obj = 
  System.Reflection.Assembly.GetExecutingAssembly().CreateInstance("A");
      var listType = typeof(List<>);
      var constructedListType = listType.MakeGenericType(obj.GetType());
      var instance = Activator.CreateInstance(constructedListType);

或者你可以使用下面的通用do

public class Utility
{
    public static IEnumerable<T> CreateDynamicList<T>()
    {
        Type typeParameterType = typeof(T);
        var listType = typeof(List<>);
        var constructedListType = listType.MakeGenericType(typeParameterType);
        return (List<T>)Convert.ChangeType(constructedListType, typeof(T));
    }
}

一样使用它
               object obj =
 System.Reflection.Assembly.GetExecutingAssembly().CreateInstance("A");

        Type utility = typeof(Utility);
        var mi = utility.GetMethod("CreateDynamicList", BindingFlags.Instance | BindingFlags.NonPublic);
        var m = mi.MakeGenericMethod(new Type[] { obj.GetType() });
        IEnumerable<A> obj=  m.Invoke(this, new object[] { obj }) as  IEnumerable<A>;
        //here you need to convert it to given type 
        // or you can do this 
        dynamic list = m.Invoke(this, new object[] { obj });
        list.Add(new A(); 

你最后的每一种方式都必须输入转换值到给定类型。