C# 有没有一种方法可以编写适用于多种类型的扩展方法?

C# 有没有一种方法可以编写适用于多种类型的扩展方法?,c#,.net,types,extension-methods,C#,.net,Types,Extension Methods,我正在尝试编写一个扩展方法,将函数HasFactor添加到C#中的类int。这项工作非常有效,如下所示: static class ExtendInt { public static bool HasFactor(this int source, int factor) { return (source % factor == 0); } } class Program { static void Main() { int

我正在尝试编写一个扩展方法,将函数
HasFactor
添加到C#中的类
int
。这项工作非常有效,如下所示:

static class ExtendInt
{
    public static bool HasFactor(this int source, int factor)
    {
        return (source % factor == 0);
    }
}

class Program
{
    static void Main()
    {
        int i = 50;
        int f = 2;
        bool b = i.HasFactor(f);
        Console.WriteLine("Is {0} a factor of {1}? {2}",f,i,b);
        Console.ReadLine();
     }
}
这非常有效,因为上面
Main()
方法中的变量
i
被声明为
int
。但是,如果
i
声明为
Int16
Int64
,则扩展方法不会显示,除非它显式转换为
int
Int32

现在我想对
Int16
Int64
应用相同的
HasFactor
方法。但是,我不希望为每种类型的
int
编写单独的扩展方法。我可以为
Int64
编写一个方法,然后将所有内容显式转换为
Int64
long
,以便显示扩展方法

理想情况下,我希望将相同的扩展方法应用于所有三种类型,而不必复制和粘贴大量代码


这在C#中可能吗?如果不可能,是否有针对这种情况的推荐最佳做法?

不,这在C#中是不可能的。您必须为每种类型创建一个扩展方法。最接近的方法是有一个在接口上操作的扩展方法,但在这种情况下,不存在由各种数字类型实现的INumeric接口或任何类似的接口。

实际上,通过复杂地使用表达式树(和/或动态,如果您在.NET 4.0中)-在这里查看Marc Grasser对另一个SO问题的回答:,以及他的MiscUtil库。好的,操作符(
%
等)可以使用这个,但不能使用扩展方法代码。所以我认为(+1)艾隆知道真相。我想,未来会有很多类似的重载,这很有趣。我想知道是否可以使用
dynamic
(或其他一些.NET4.0功能)将扩展方法限制为特定类型。这样做了吗?(也许这应该是一个单独的SO问题)。这绝对是一个有趣的想法。尽管如此,我认为即使使用dynamic,您也希望该类型实现IDynamiObject,这当然不是一个选项,因为您不拥有所讨论的类型(int、long等)。基于Eilon和Marc Gravell的输入,我想我将为type
Int64
创建一个扩展方法。这对我的工作应该有用。