1

我有一些代码,实例化对象,看起来像这样

ObjectHandle instance = Activator.CreateInstance(assembly, cls);
return (T)instance.Unwrap();

现在,大多数时候由 表示的类型cls没有构造函数并且很容易创建。但是我有一个类,它有一个带参数的构造函数。在此调用上面的代码会出现以下错误

Constructor on type 'X' not found

该参数是一个接口,我已将 Autofac 配置为返回它的特定具体实例。我的问题是,将上面的代码更改为“找到”这个构造函数,让 Autofac 返回参数的具体实例,然后实例化对象,同时仍然允许另一个无构造函数的方法是什么?类被实例化?

4

1 回答 1

2

一旦您在代码中定义了构造函数,编译器将不再为您生成默认的无参数构造函数。这通常不是什么大问题,除非您使用Lazy<T>or 在您的情况下:Activator.CreateInstance,它将始终使用默认的无参数构造函数。

强制传递给此方法的类具有无参数构造函数的“最干净”方法是new()对您的方法使用约束:

public T SomeMethod<T>(Assembly asm, T type) where T : new()

这将告诉编译器,无论调用此函数的什么都需要有一个无参数的构造函数,如果没有,它将不会编译。

有点脏的方法是在当前给您带来问题的类型中声明一个无参数构造函数,但这是一个创可贴;它实际上并没有解决问题。

注意:如果您在方法上使用任何其他类型的约束,则该new()约束必须始终是最后一个。

于 2013-07-20T23:10:18.553 回答