我有一个代码如下:
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。
任何帮助表示赞赏!
答案 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);
列表不会是强类型的,但您可以将项目添加为对象。