2012-07-06 54 views
2

我想編譯一個包含這個方法的項目;投射到原始類型並使用參數?

public void Send<T>(object o) where T : struct { 
    BinaryWriter bw = new BinaryWriter(stream); 
    bw.Write((T)o); 
} 

我從這種方法(工作)的啓發;

public static T Cast<T>(object o) { 
    return (T)o; 
} 

BinaryWriter.Write函數支持參數的基本類型,所以我想我可以像這樣使用它。但是,Visual Studio中說:「爲‘System.IO.BinaryWriter.Write(布爾)’的最佳重載的方法匹配具有一些無效參數

我試圖避免編寫包含每一個原始類型長switch語句併爲選擇類型的方法添加一個參數。這是醜陋的,看起來不正確。

這是簡單和優雅:

  • 發送< int>的(123);
  • 發送< bool>(true);

但爲什麼它不工作?什麼是正確的做法呢?

+0

你想用什麼來實現,你是否熟悉[序列化概念](http://msdn.microsoft.com/en-us/library/4abbf6k0(v = vs.71).aspx),也許這是你可以嘗試的另一種方法。 – danielQ 2012-07-06 21:04:29

回答

3

過載分辨率在編譯時間執行。所以編譯器試圖找到一個方法,該方法的參數是有效的* T是(在其限制內,這在這裏沒有幫助)。它找不到這樣一種方法。假設唯一的約束是T必須是一個結構,那麼只有將是有效的非泛型參數類型將是object(通過裝箱)。

如果你的目的是使用基於執行時間對象的類型爲準超載是合適的,你需要爲使用動態類型,像這樣:

public void Send(dynamic d) { 
    BinaryWriter bw = new BinaryWriter(stream); 
    bw.Write(d); 
} 

...或者使用反射來獲取和執行正確的重載(這是動態類型會做的事情)。

+0

我不熟悉「動態」關鍵字,但它似乎工作:)我會閱讀有關它,謝謝。 – 2012-07-06 21:08:08