在IEnumerable <t>上定义扩展方法,其中T是特定类型的类型?</t>

时间:2009-11-06 21:03:46

标签: .net generics collections

我想要一种方法只能处理实现/,+, - ,*运算符的类型。有没有“干净”的方法来做到这一点?

4 个答案:

答案 0 :(得分:2)

这需要一个接口,例如IArithmetic。

不幸的是,目前这种做法并不奏效。不过,这是一个highly requested feature

some workarounds,通常需要使用第二个通用参数,但大多数不适用于IEnumerator<T>

答案 1 :(得分:0)

您可以在类型参数上定义constraints。所以你可以要求T实现一个接口:

public static class Classy
{
    public static void Extension<T>(this IEnumerable<T> Ninjas) 
        where T : IMathStuff
    {

    }
}

这需要所有T实现IMathStuff。现在,如果您无法将运算符放入IMathStuff接口,则可以将接口留空为Marker Interface,并仅将其应用于实现运算符的类。

这种假设您使用的是所有自定义类,而不是内置类型。这是一种不完全支持的解决方法。

答案 2 :(得分:0)

没有一种干净的方法可以做到这一点。您需要实现IEnumberable&lt; int&gt;,IEnumberable&lt; float&gt; ...等

答案 3 :(得分:0)

不在编译时。我想你必须使用反射。

很多都是值类型,例如int和long,“where T:struct”,但没有它们共有的接口或基类型。