如何创建从反射中获得的类型列表

时间:2014-02-02 17:01:03

标签: c# list c#-4.0 reflection wpfdatagrid

我有一个代码如下:

Assembly assembly = Assembly.LoadFrom("ReflectionTest.dll");
Type myType = assembly.GetType(@"ReflectionTest.TestObject");
var x = Convert.ChangeType((object)t, myType);   

//List<myType> myList = new List<myType>();
//myList.Add(x);

代码的注释部分是我被卡住的地方。我从服务中获取了一些对象,转换也正常。我正在尝试填充此类对象的列表,稍后将绑定到WPF DataGrid。

任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:3)

var listType = typeof(List<>).MakeGenericType(myType)
var list = Activator.CreateInstance(listType);

var addMethod = listType.GetMethod("Add");
addMethod.Invoke(list, new object[] { x });

您可以直接转换为IList并直接致电Add,而不是使用反射查找方法:

var list = (IList)Activator.CreateInstance(listType);
list.Add(x);

答案 1 :(得分:1)

您需要MakeGenericType方法:

var argument = new Type[] { typeof(myType) };
var listType = typeof(List<>); 
var genericType = listType.MakeGenericType(argument); // create generic type
var instance = Activator.CreateInstance(genericType);  // create generic List instance

var method = listType.GetMethod("Add"); // get Add method
method.Invoke(instance, new [] { argument }); // invoke add method 

或者,您可以将实例转换为IList并直接使用Add方法。或者使用dynamic输入,不要担心投射:

dynamic list = Activator.CreateInstance(genericType);
list.Add("bla bla bla...");

答案 2 :(得分:1)

试试这个:

var listType = typeof(List<>);
var constructedListType = listType.MakeGenericType(myType);

var myList = (IList)Activator.CreateInstance(constructedListType);
myList.Add(x);

列表不会是强类型的,但您可以将项目添加为对象。