C#通过反射创建泛型List调用Add方法触发类型转换错误如何解决
问题原因
代码在构造泛型列表类型时传错了泛型参数:
- 你定义的
type变量值是typeof(List<myObject>),再传入typeof(List<>).MakeGenericType(type),最终生成的是嵌套的List<List<myObject>>类型,不是你期望的List<myObject> - 因此这个列表的
Add方法要求接收的参数是List<myObject>类型,你传入myObject实例自然会报类型不匹配的错误
解决方法
只需要把传入MakeGenericType的参数换成列表元素myObject的类型即可,修正后完整代码如下:
public class myObject { public object FieldValue { get; set; } public int ID_OpenField { get; set; } } private void Form1_Load(object sender, EventArgs e) { // 这里取列表元素的类型,不是List容器本身的类型 Type elementType = typeof(myObject); // 构造List<myObject>的泛型类型 var genericType = typeof(List<>).MakeGenericType(elementType); var list = Activator.CreateInstance(genericType); myObject obj = new myObject() { FieldValue = "TextObjectValue", ID_OpenField = 1 }; object[] o = new object[] { obj }; list.GetType().GetMethod("Add").Invoke(list, o); }
如果需要动态生成任意T类型的列表,只需要把上述代码中的elementType替换为对应T的Type实例即可。
内容的提问来源于stack exchange,提问作者bama71
相关产品推荐
相关产品推荐

