我有一些代码,它实例化了对象,看起来像这个
ObjectHandle instance = Activator.CreateInstance(assembly, cls);
return (T)instance.Unwrap();
现在,大多数情况下,cls
表示的类型没有构造函数,并且很容易创建。但我有一个类,它有一个接受参数的构造函数。调用上面的代码会产生以下错误
Constructor on type 'X' not found
参数是一个接口,我已经配置了Autofac来返回它的特定具体实例。我的问题是,改变上面的代码以"找到"这个构造函数,让Autofac返回参数的具体实例,然后实例化对象,同时仍然允许另一个,实例化无构造类?
一旦在代码中定义了构造函数,编译器将不再为您生成默认的无参数构造函数。这通常不是什么大问题,除非您使用Lazy<T>
,或者在您的情况下使用Activator.CreateInstance
,它将始终使用默认的无参数构造函数。
强制传递到此方法中的类具有无参数构造函数的"最干净"方法是对方法使用new()
约束:
public T SomeMethod<T>(Assembly asm, T type) where T : new()
这将告诉编译器,无论调用什么函数,都需要有一个无参数构造函数,如果没有,就不会编译。
有点脏的方法只是在当前给您带来问题的类型中声明一个无参数构造函数,但这是一个bandaid;它实际上并没有解决问题。
注意:如果在方法中使用任何其他类型的约束,则new()
约束必须始终是最后一个