通过反射创建的类实例无法添加到泛型List容器的问题求助
问题原因
- 变量引用错误:你创建的实例存储在变量
x中,但调用container.Add时传入了尚未声明的变量y,先修正为传入x。 - 动态绑定类型不匹配:
Activator.CreateInstance返回值的编译期类型为object,dynamic执行方法重载匹配时会优先使用参数的编译期类型,而非运行时实际类型,因此无法匹配List<MyType>.Add(MyType)的参数要求,抛出异常。 - 索引器调用错误:C#中
List<T>的索引器直接使用[索引]语法访问,无需显式写.Item属性,.Item是索引器的内部实现名称,不符合C#语法规范。
可行解决方案
方案1:保留dynamic用法,调整参数类型
将创建的实例也声明为dynamic,让运行时可以识别到实例的实际类型,正确匹配Add方法重载:
// 前面创建applicationModelType、container的代码不变 dynamic x = Activator.CreateInstance(applicationModelType); container.Add(x); dynamic y = container[0];
方案2:完全基于反射实现(无动态绑定开销,兼容性更高)
如果不想依赖dynamic的运行时绑定,可直接通过反射调用Add方法和索引器,运行更稳定:
// 前面创建applicationModelType、applicationModelContainerType、container的代码不变 object x = Activator.CreateInstance(applicationModelType); // 反射调用Add方法 MethodInfo addMethod = applicationModelContainerType.GetMethod("Add", new[] { applicationModelType }); addMethod.Invoke(container, new[] { x }); // 反射获取第一个元素 object y = applicationModelContainerType.GetProperty("Item").GetValue(container, new object[] { 0 });
内容的提问来源于stack exchange,提问作者James Parsons
相关产品推荐
相关产品推荐

