2010-01-01 80 views
7

我试图编写一个扩展方法,将函数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编写单独的扩展方法。 I 可能会Int64编写单一方法,然后将所有内容明确地转换为Int64long以使扩展方法出现。

理想情况下,我宁愿将相同的扩展方法应用于所有三种类型,而无需复制和粘贴大量代码。

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

+0

基于Eilon和Marc Gravell的输入,我想我会为'Int64'类型创建一个扩展方法。这应该适用于我正在做的事情。 – 2010-01-02 00:26:18

回答

6

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

+0

事实上,它可能通过表达式树(和/或动态,如果你在.NET 4.0中)的一些复杂的用法 - 检查出马克Gravel的答案在这里另一个SO问题:http://stackoverflow.com/questions/1987136/应该重载方法与值类型被合并成一个通用方法/ 1987308#1987308,和他的MiscUtil库。 – 2010-01-01 23:46:01

+0

那么,**运营商**('%'等)可以使用这个 - 但不是扩展方法代码。所以我认为(+1)Eilon知道它的真相。我怀疑将来会出现一些非常类似的过载。 – 2010-01-01 23:57:20

+0

这很有趣。我很想知道是否可以使用'dynamic'(或其他.NET 4.0功能)将扩展方法限制为特定类型。这样做了吗? (也许这应该是一个单独的SO问题)。 – 2010-01-02 00:09:22

相关问题