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