2012-11-05 27 views

回答

2

是的,我很害怕。你需要有效地愚弄C#編譯器,不要試圖尋找更有意義的轉換。

我個人通常發現,如果一個方法只能處理某些類型的,最好是有過載,而不是讓它擺在首位通用的,但它取決於形勢。

如果你真的試圖執行重載(有沒有在你的代碼示例所示超載,因爲只有每個名稱的單一方法),如果你正在使用C#4,你使用動態打字:

public class SampleClass<T> { 
    public void OtherMethod(int arg) {} 
    public void OtherMethod(string arg) {} 
    public void OtherMethod(DateTime arg) {} 

    public void Method(T arg) { 
     dynamic d = arg; 
     OtherMethod(d); 
    } 
} 

這會在執行時失敗,當然如果沒有合適的過載。

+0

您可以創建一個默認的採用T的OtherMethod。這意味着沒有發現明確的重載。至少......我想。 – LightStriker

+0

@LightStriker:是的,你可以,如果你想。我*認爲*重載分辨率會更喜歡一個沒有使用泛型類型參數的超載... –

+0

感謝您的澄清。 – sgtz

0

這可以是一個選項,如果你想它通用,否則我同意喬恩過重更乾淨。

public void method<T>(T arg1) where T : IConvertible 
{ 
    OtherMethod(arg1.ToInt32(CultureInfo.InvariantCulture)); 
} 

在你的情況下,你需要約束你的類或T1的這種方法。 請注意,如果您傳遞類似1.2的雙倍數據,則可能會導致數據丟失。

1

其實,你可以完全避免裝箱/拆箱......

public class TOfTestCase<T> { 
    public void otherMethod(int arg1) { 

    } 

    public void method(T arg1) { 
     if (typeof(T) == typeof(int)) { 
      otherMethod(__refvalue(__makeref(arg1), int)); 
     } 
    } 
} 

...如果你不介意使用這些關鍵字。 = P

+0

有趣。它也更快嗎?謝謝。 – sgtz

+0

@sgtz:我很確定它是,是的,因爲沒有堆分配在任何地方。據我所知,這是在不使用MSIL編程的情況下完成這項工作的最快方法。 – Mehrdad

相關問題