class Factory<Product> where Product : new()
{
public Factory()
: this(() => new Product())
{
}
public Factory(System.Func<Product> build)
{
this.build = build;
}
public Product Build()
{
return build();
}
private System.Func<Product> build;
}
在Factory
中,当Product
有一个公共默认构造函数时,我希望客户端不必指定如何构造一个(通过第一个构造函数)。但是,我想允许Product
没有公共默认构造函数的情况(通过第二个构造函数)。
Factory
的通用约束是允许实现第一个构造函数所必需的,但它禁止在没有公共默认构造函数的情况下使用任何类。
有没有办法允许两者?
答案 0 :(得分:8)
不是直接的,但您可以使用非泛型Factory
工厂(原文如此)和泛型方法,将类型约束放在方法的的类型参数上,并使用该方法将委托提供给不受约束的Factory<T>
类。
static class Factory
{
public static Factory<T> FromConstructor<T>() where T : new()
{
return new Factory<T>(() => new T());
}
}
class Factory<TProduct>
{
public Factory(Func<TProduct> build)
{
this.build = build;
}
public TProduct Build()
{
return build();
}
private Func<TProduct> build;
}