2013-01-20 26 views
0

我遇到了一種情況,我很好奇這種用例可能有哪些可能的解決方案或備選方案。分配給類屬性的通用方法參數

我有一個接受通用參數的方法簽名的類。所以,我提出的方法簽名本身一般:

/// <summary> 
///  Input Widget. 
/// </summary> 
public sealed class InputWidget { 
    /// <summary> 
    ///  Widget's Control. 
    /// </summary> 
    public IList<dynamic> Controls { get; private set; } 

    public InputWidget AddControl<TC>(InputControl<TC> control) where TC : BaseControl<TC> { 
     this.Controls.Add(control); 
     return this; 
    } 
} 

如果我想該參數指定的類屬性,不管是什麼原因,我不能這樣做,除非屬性的類型爲object,或開始。 NET 4,dynamic

使用dynamic而不是object爲我省去了一個麻煩,即當我從列表中檢索每個元素以供進一步使用時,必須將object重塑爲其泛型類型。但是我對dynamic也不太滿意,因爲我沒有編譯類型安全性,Intellisense,如果我不小心,它可能在運行時是致命的。

那麼,爲什麼我不簡單地聲明我的類是通用的?因爲我不想限制我的方法接受特定類型的InputControl。此外,我還定義了其他方法,我省略了這些方法,但需要採用相同的方法。如果使用N個泛型類型來定義我的類會很無聊,其中N是這種情況下方法的數量。

那麼處理這種情況的最佳方法是什麼?我錯過了什麼嗎?我是否錯誤地思考?更糟糕的是,我的設計完全錯誤,我需要重新開始閱讀一本初學者書籍?

+1

你要求做的事情本質上是非類型安全的。如果我叫'AddControl ()'怎麼辦?您可能需要一個非泛型基類型,協方差和/或約束。你想達到什麼目的? – SLaks

+0

@SLaks我在方法簽名中省略了類型約束。我在我的例子中再次添加了它。 – 9ee1

+0

@SLaks基本上,我想了解什麼是這樣的問題最好的辦法。我想過使用非泛型基類型,事實上,我現在就是這樣解決它的。但是,你介意提供其他建議的例子嗎? – 9ee1

回答

0

聽起來好像您實際上在詢問如何存儲InputControl<TC>的集合,其中集合中的每個項目可以有不同的TC

有兩種方法做到這一點:

  • 創建暴露你從收集所需要的功能非一般的基類或接口,以及商店來代替。這也可以讓你使所有的方法都是非通用的

  • InputControl<TC>替換爲一個逆變界面,並使用List<IInputControl<BaseControl>>。使用反變換,您可以將任意IInputControl<TC> s轉換爲IInputControl<BaseControl>

+0

雖然我沒有具體詢問如何存儲'InputControl '的集合,其中每個項目都是不同的'TC' - 在我看來,即使該屬性不是集合,場景也可以工作 - 您的答案似乎正確。謝謝你的幫助。 – 9ee1

相關問題