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

8

我正在尝试编写一个扩展方法,将函数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声明为Int16Int64,除非将其显式转换为intInt32,否则扩展方法不会出现。
现在我想将相同的HasFactor方法应用于Int16Int64。但是,我不想为每种类型的int编写单独的扩展方法。我可以为Int64编写一个单一的方法,然后将所有内容显式转换为Int64long,以便扩展方法出现。
理想情况下,我希望相同的扩展方法适用于这三种类型,而不必复制和粘贴大量代码。
在C#中是否有可能实现这一点?如果不行,是否有推荐的最佳做法?

根据Eilon和Marc Gravell的输入,我打算为类型Int64创建一个扩展方法。这应该适用于我正在做的事情。 - Ben McCormack
1个回答

6
不,C#中不可能实现这一点。你需要为每个类型创建一个扩展方法。最接近的方法是创建一个操作接口的扩展方法,但在这种情况下,各种数字类型并没有实现INumeric接口或类似的接口。

实际上,通过一些复杂的表达式树的使用(如果您在.NET 4.0中,则可以使用动态方法),这是可能的-请查看Marc Gravel在另一个SO问题的答案:http://stackoverflow.com/questions/1987136/should-overloaded-methods-with-value-types-be-consolidated-into-a-generic-method/1987308#1987308,以及他的MiscUtil库。 - Aviad P.
好的,运算符%等)可以使用这个 - 但扩展方法代码不行。所以我认为(+1),Eilon说得对。我猜将来会有很多非常相似的重载。 - Marc Gravell
这很有趣。我很想知道是否可以使用dynamic(或其他.NET 4.0功能)来限制扩展方法仅适用于特定类型。这是否已经完成?(也许这应该是一个单独的SO问题)。 - Ben McCormack
这绝对是一个有趣的想法。不过,我认为即使使用动态类型,你也需要让该类型实现IDynamicObject接口,但由于你无法拥有所涉及的类型(如int、long等),这当然不是一个选项。 - Eilon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接