使用Activator.CreateInstance创建泛型类实例时抛出构造函数未找到异常
问题分析与解决方案
你的错误根源非常清晰:你试图给GenericClass<T>的构造函数传递参数,但这个类根本没有定义带参数的构造函数——它只有默认的无参构造函数,所以Activator.CreateInstance找不到匹配的构造函数,才抛出了这个错误。
而且你的代码逻辑出现了混淆:你要传递的args是给目标类(比如DC_Header_Vendor)的构造函数用的,不是给GenericClass<T>的构造函数用的。
第一步:修正GenericClass<T>的冗余泛型定义
你的ObjectCreate方法重复定义了泛型参数T,这和类的泛型参数T冲突,也完全没必要。先把这个方法的泛型参数去掉:
namespace eDebitCreditNote.Models { public class GenericClass<T> { // 去掉方法的泛型参数,直接复用类的泛型T public T ObjectCreate(object[] args) { return (T)Activator.CreateInstance(typeof(T), args); } public IDictionary<string, object> FieldValues { get; set; } } }
第二步:修正实例化逻辑
你需要先创建GenericClass<T>的无参实例,再调用它的ObjectCreate方法来传入参数创建目标类的实例:
object[] args = new object[1] { values }; string classname = tblform.HeaderTable; var sometype = Type.GetType("eDebitCreditNote.Models." + classname); var genericType = typeof(GenericClass<>).MakeGenericType(new[] { sometype }); // 1. 创建GenericClass<T>的无参实例(因为它只有无参构造) var genericInstance = Activator.CreateInstance(genericType); // 2. 获取ObjectCreate方法并调用,传入目标类构造所需的参数 var createMethod = genericType.GetMethod("ObjectCreate"); var targetInstance = createMethod.Invoke(genericInstance, new[] { args });
额外说明
- 如果
Type.GetType返回null,你可能需要在类名后加上程序集名称(比如"eDebitCreditNote.Models.DC_Header_Vendor, eDebitCreditNote"),不过从你的错误信息来看,类型已经被找到,所以暂时不需要担心这个问题。 - 如果你确实需要
GenericClass<T>支持带参构造,那你需要在类里显式定义对应的构造函数,但根据你的需求,这完全没必要——因为参数是给目标类用的,不是给泛型类用的。
内容的提问来源于stack exchange,提问作者Rahul Jain
相关产品推荐
相关产品推荐

