如果我有多个类,如A类,B类,C类等等。
我希望将此作为泛型类型传递给基于字符串变量值的列表,如果字符串是" A",则传递类A,如果它是" B"然后是B类等等(没有条件检查,因为字符串的值没有决定)。
因此,如果存在一个值为" A"的字符串变量,那么该类的类型应该如下传递。
IEnumerable<A> obj = SomeClassObj.GetData<A>(); //Here, need to add type of class A
那么实现这个目标的方法是什么?
答案 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();
你最后的每一种方式都必须输入转换值到给定类型。