2013-03-09 61 views
3

我有以這種方式所定義的基本DataTag類:處理不同的表示方法

public abstract class DataTag<TRaw, TVal> 
{ 
    public abstract TVal Value { get; } 
    public TRaw RawValue { get; set; } 
    public string Name { get; private set; } 
    public string Desc { get; private set; } 
} 

其中TRaw是從設備拍攝的原始數據,而TVal是「格式化的」值。

所以我也可以有相同的設備2個標籤:

DataTag t1 = DataTag.Create<ushort,int>(); 
DataTag t2 = DataTag.Create<ushort[],float()>; 

現在我有它應該包含通用標籤

private IEnumerable<DataTag<?,?> _tags(); 

當然C#的名單將不接受不同類型的類泛型在同一個列表中,但這是我想實現的。任何提示?

+0

與此問題類似。你有這裏的代碼示例: http://stackoverflow.com/questions/1541152/c-sharp-generic-where-constraint-with-any-generic-type-definition – Nenad 2013-03-09 11:58:02

回答

4

一種常見的方法是聲明非泛型基類。它當然不會給你強有力的數據訪問權限,但你可能會得到一個普通的版本和名稱/描述。

public abstract class DataTag 
{ 
    public string Name { get; private set; } 
    public string Description { get; private set; } 
    public abstract object WeakValue { get; } 
    public abstract object WeakRawValue { get; } 
} 

public abstract class DataTag<TRaw, TVal> : DataTag 
{ 
    public abstract TVal Value { get; } 
    public TRaw RawValue { get; set; } 

    public override object WeakValue { get { return Value; } } 
    public override object WeakRawValue { get { return RawValue; } } 
} 

然後你的清單只是一個IEnumerable<DataTag>

注:

  • 我已經給了不同的名稱爲 「弱類型」 的屬性。你可能使用ValueRawValue,然後重新聲明他們(與new)在泛型類型,但這是在其他方面的脖子疼痛。如果可以,避免命名衝突。
  • 我只提供了一個吸氣劑WeakRawValue - 你可能也提供了一個setter,並在泛型類型中投射,但這對我來說感覺很難看。哎呀,我會親自嘗試徹底擺脫setter,並將值作爲構造函數參數傳遞,使類型更接近不可變。 (如果任何一個泛型類型參數本身是一個可變類型,它就不會「正確」不可變,但它總比沒有好......)
+0

這是我想到的第一個解決方案。但是我正在尋找不同的東西。 – Vincenzo 2013-03-09 11:59:39

+2

@Vincenzo:如果你已經想出了一個解決方案並放棄了它 - 大概是出於某種原因 - 當你寫這個問題時這麼說很有幫助。我不知道有更好的方法。你爲什麼不喜歡這種方法? – 2013-03-09 12:02:33

+0

我一直在尋找新的解決方案(如果有的話)以更好地管理此問題。但是,您的答案和建議的解決方案非常專業,比礦山更好。謝謝。 – Vincenzo 2013-03-09 12:05:09

相關問題