C#泛型方法,在new()构造函数约束中输入参数

时间:2010-07-29 15:53:53

标签: c# .net generics type-constraints

有没有办法创建一个使用new()构造函数约束的通用方法来要求具有特定类型构造函数的类?

例如:

我有以下代码:

public T MyGenericMethod<T>(MyClass c) where T : class
{
    if (typeof(T).GetConstructor(new Type[] { typeof(MyClass) }) == null)
    {
        throw new ArgumentException("Invalid class supplied");
    }
    // ...
}

有可能有这样的东西吗?

public T MyGenericMethod<T>(MyClass c) where T : new(MyClass)
{
    // ...
}

编辑:关于此问题a suggestion。请投票,以便我们可以在C#中使用此功能!

3 个答案:

答案 0 :(得分:28)

不是真的; C#仅支持no-args构造函数约束。

我用于通用arg构造函数的解决方法是将构造函数指定为委托:

public T MyGenericMethod<T>(MyClass c, Func<MyClass, T> ctor) {
    // ...
    T newTObj = ctor(c);
    // ...
}

然后在打电话时:

MyClass c = new MyClass();
MyGenericMethod<OtherClass>(c, co => new OtherClass(co));

答案 1 :(得分:5)

没有。不幸的是,通用约束只允许你包括:

where T : new()

其中指定存在默认的无参数构造函数。没有办法约束到具有接受特定参数类型的构造函数的类型。

有关详细信息,请参阅Constraints on Type Parameters

答案 2 :(得分:2)

不,在C#中不可能将泛型类型约束为具有特定签名的构造函数。 new()只支持无参数构造函数。