【问题标题】:C# generic methods, type parameters in new() constructor constraintC# 泛型方法,new() 构造函数约束中的类型参数
【发布时间】:2010-07-29 15:53:52
【问题描述】:

有没有办法创建一个使用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# 中使用此功能!

【问题讨论】:

  • 我有点困惑。你到底想完成什么。构造函数会接受 MyClass 的参数,还是将 T 限制为 MyClass?

标签: c# .net generics type-constraints


【解决方案1】:

不是真的; C# 仅支持无参数构造函数约束。

我用于泛型 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));

【讨论】:

    【解决方案2】:

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

    where T : new()
    

    它指定有一个默认的无参数构造函数。无法使用接受特定参数类型的构造函数来限制类型。

    详情请见Constraints on Type Parameters

    【讨论】:

    • 是的,我读过那篇文章,但它对 new() 约束不是很具体。无论如何,谢谢,我想我会把我的验证留在原处......
    • @Joel:他们显示的选项是 new() 约束的唯一选项。没有办法添加参数。
    【解决方案3】:

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

    【讨论】:

    • 这将是一个不错的补充!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 2011-09-10
    相关资源
    最近更新 更多