具有“条件”约束的C#泛型类?

时间:2012-03-09 15:49:43

标签: c# generics

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的通用约束是允许实现第一个构造函数所必需的,但它禁止在没有公共默认构造函数的情况下使用任何类。

有没有办法允许两者?

1 个答案:

答案 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;
}