在C#中,有没有办法强制一个类必须有一个无参数构造函数?
答案 0 :(得分:16)
如果你在讨论通用约束,是的:
class SomeContainer<T> where T : new() {
...
}
如果你在谈论继承。不可能要求实现接口或继承基类的每个类都具有无参数构造函数。
您可以做的最好的事情是在基础构造函数中使用反射来抛出异常(在运行时),如下所示:
abstract class MyBase {
protected MyBase() {
if (GetType().GetConstructor(Type.EmptyTypes) == null)
throw new InvalidProgramException();
}
}
如果你在谈论一个班级,是的;只需放入一个。
答案 1 :(得分:2)
泛型可以强制执行此操作,但我们并不总是使用泛型; p
如果您正在使用单元测试,则可以使用反射来查找符合您想要模式的所有类型,以获得无参数构造函数(例如,从MyBaseObject
派生的所有内容,或者Foo.Bar
命名空间中的所有内容),并验证这种方式(通过查找无参数构造函数)。
如果你想在运行时断言(也许在#DEBUG
中),那么像静态构造函数这样的东西可以成为注入额外类型检查的有用点。
答案 2 :(得分:1)
这取决于你的意思。
例如,您可以将类或方法中的泛型类型参数约束为具有new
关键字的无参数构造函数,但是没有真正的方法来限制实际的类定义。
public void DoSomething<T>() where T : new() { }
答案 3 :(得分:1)
正如官方MSDN文档中所述,C#编译器自动生成一个无参数构造函数,将所有成员变量初始化为默认值。如果您希望强制执行自己的实现,可以这样做:
类BaseClass { BaseClass(){//无参数构造函数的实现} }
如果您指的是通用约束,请参阅SLaks的帖子。
<强>参考强>
答案 4 :(得分:0)
我遇到过这样的问题很多次,我认为需要抽象/接口构造函数。问题是当你使用Activator.CreateInstance
或其他技术来实例化你可能没有实现的类型时(很常见的IoC)。如果您可以强制开发人员使用正确的参数实现构造函数,那么生活将变得更加容易 - 即使目的只是将参数传递给基础构造函数。
new()
约束自2.0以来帮助解决了这个问题,但是当使用不使用泛型时,或者如果你想要特定的参数(并且不想弄乱)时,它仍然无法解决问题使用尴尬的ConstructorInfo,无法静态检查。)