2015-06-14 57 views
4

我應該避免使用泛型進行類型檢查嗎?不使用傳統類型檢查比較(myvar is int),而是使用類型的typecode。通用類型碼型檢查?

使用泛型,通過類型檢查,您可以創建一個沒有支持常規重載方法任務的參數的單個方法。這是無參數方法的問題,它們不能被重載。

// "Buffer" is the byte[] while "Peek" is the read/write position. Then Align" is the alignment size in bytes of the buffer. 
public type Read<type>() { 
    switch(Type.GetTypeCode(typeof(type))) { 
     case System.TypeCode.Boolean: 
      bool bool_val = (Buff[ Peek ] > 0); 
      Peek = (++Peek + (Align - 1)) & ~(Align - 1); 
      return (type)(object)bool_val; 
     case System.TypeCode.Byte: 
      byte byte_val = Buff[ Peek ]; 
      Peek = (++Peek + (Align - 1)) & ~(Align - 1); 
      return (type)(object)byte_val; 
     case TypeCode.Ushort: 
      ushort ushort_val = (ushort)(Buff[ Peek ] | (Buff[ Peek + 1 ] << 8)); 
      Peek += 2; 
      Peek = (Peek + (Align - 1)) & ~(Align - 1); 
      return (type)(object)ushort_val; 
     break; 
     ... 
    } 
} 

這似乎是實現無參數方法重載形式的唯一方法。這被認爲是不好的做法?

+0

無論是好還是壞的做法通常都是非常有關聯的。你能否提供一些你想要達到的細節? –

+0

好點。我正在爲網絡系統編寫一個緩衝區類。我需要幾種類型的讀/寫方法。然而這對於讀取方法來說並不容易,因爲它們不能被重載。這迫使我要麼使用泛型類型檢查,要麼使用多個個性化方法 - 從設計的角度來看,這也很糟糕。但是,您可以將此應用於大多數情況下,您只需要一種多功能類型的需要通用控制的方法。 – Kayle

+0

你能給出'Boolean'和'Byte'各自情況的例子嗎?就目前來看,我甚至沒有看到需要使這個方法成爲通用的(而不是將'Type'作爲常規參數傳遞)。如果這個方法並不是真的需要通用 - 而是僅僅被用作硬編碼專用案例的調用點,那麼不,這不是壞習慣,要做你正在做的事情(因爲沒有其他方法實現它)。但是,正如我所說的,方法體中的更多細節可以讓您更容易地看到您的想法。 –

回答

1

你可以讓你的代碼一般像這樣的東西:

var size = Marshal.SizeOf(typeof(T)); 
var subBuffer = new byte[size]; 
Array.Copy(Buff, Peek, subBuffer, 0, size); 
var handle = GCHandle.Alloc(subBuffer, GCHandleType.Pinned); 
var ptr = handle.ToIntPtr(); 
var val = (T)Marshal.PtrToStructure(ptr, typeof(T)); 
ptr.Free(); 
Peek += size; 
Peek = (Peek + (Align - 1)) & ~(Align - 1); 
return val; 

然而,如果這個性能問題,受到了你的使用情況,然後提供硬編碼的專門版本,可能不是一個糟糕的方式這樣做,因爲沒有任何明顯的選擇。