2010-01-01 106 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

相關問題