我应该使用什么方法定义来在IEquatable <t> </t>上创建扩展方法

时间:2012-11-27 15:40:28

标签: c# generics extension-methods

我打算在In上创建int扩展方法,当我意识到,如果我使用IEquatable,我会得到所有原始类型的扩展。这是我目前的实施

public static bool In<T>(this T value, params T[] values) where T : IEquatable<T>
{
    return values.Contains(value);
}

对于整数来说,if(i.In(1,3,7))工作得很好,但where T: IEquatable<T>看起来对我来说不对。这是定义泛型方法的正确方法吗?

4 个答案:

答案 0 :(得分:1)

请勿使用this T value作为方法参数,而是使用this IEquatable<T> value。那么你不需要对T的约束,你也只为IEquatable定义它。

答案 1 :(得分:1)

你看起来对我来说是对的。您说该类型必须为其自己的类型实现IEquatable<T>

你也可以扩展它,说你要比较的类型可以是为IEquatable<T>实现value的不同类型:

public static bool In<T, U>(this T value, params U[] values) where U : IEquatable<T>
{
    bool result = false;
    foreach (U instance in values)
    {
        if (instance.Equals(value))
        {
            result = true;
            break;
        }
    }
    return result;
}

答案 2 :(得分:1)

是的,这是正确的。 (不知道还有什么要说的。我已经定义了相同的方法,虽然我开始相信我不喜欢它的风格,但它的工作正常。当然,这是主观的。)

答案 3 :(得分:0)

where T: IEquatable<T>generic constraint,所以它非常好,而且是限制使用通用方法/类/使用有限类型集合的首选方法。