2009-10-14 82 views
1

我有一個接口如下:「使用通用型.... <T>要求1個類型參數和通用多個約束,並使用任一

public interface ITestCase<T> where T : HtmlControl 
{ 
    IEnumerable<T> Execute(Manager manager); 
} 

HTMLLoader對象是從第三方組件的基類

我有這個接口的兩個實現。

其中之一就是返回null(由我指定),直到我指甲所需的邏輯(不是一件難事)。

問題是,我把從我的窗體的代碼隱藏這個第二個實施:

var LoginJuniper = new Login<ArtOfTest.WebAii.Controls.HtmlControls.HtmlDiv>(); 
LoginProcedure.Login(textBox1.Text, new Test1()); 

的登錄類,以及所有其他類,採取同樣的類型約束的參數(其中T是HTMLControl時,從所有的人第三方API)。

另外,我遇​​到的另一個問題是當我使用多個類型的約束;是否有可能說T可以是這些約束條件中的一個或多個?例如。如果我有:

<T> where T : HtmlControl, IElement 

我可以傳入任何類型的可能是IElement而不是HtmlControl的實現,反之亦然?僅通過1接口。這將非常有用,因爲我想將更多類型傳遞給泛型類型約束,因爲我從接口派生的接口和測試用例可以測試的不僅僅是HtmlControls類(也可以測試IElements實現,就像在第三方API中一樣允許我獲取屏幕截圖,並且我想測試這些屏幕截圖(獲取像素,聲明顏色是正確的))。

感謝

+1

你可以發佈一個單一的,完整的程序來演示問題嗎? – 2009-10-14 10:01:23

+0

這個問題中沒有正確的詳細信息。嘗試專注於單個主要問題,如果稍後需要,可以將其他問題留給另一個問題。向我們展示使用ITestCase 的類以及對「執行」的調用。 – AnthonyWJones 2009-10-14 10:16:22

+0

我將在一個單獨的線程中重新發布主要問題。謝謝。 – csharpdev 2009-10-14 10:52:16

回答

1

我不清楚你想要什麼答案(也許你可以嘗試總結你的實際問題)。

使用多個約束類型的情況下

但是,MSDN文檔說:

通過約束類型參數, 你增加允許 操作的數量和方法調用通過約束支持的那些 類型和 所有類型在其繼承 層次結構。因此,當你設計 泛型類或方法,如果你 將在 超越簡單 分配的一般成員進行任何操作或調用不 通過支持System.Object的任何方法,你會 必須約束適用類型 參數。

這基本上意味着對象T必須實現您提供的所有約束。因此,您不能使用不是從HtmlControl實施IElement派生的類型的方法。

有一種解決方法,但它不是很漂亮,你可能會分裂。但你可以這樣做:

void Foo<T>(T arg) 
{ 
    if (arg is IElement) 
    { 
    var argAsIElement = arg as IElement; 

    // Do something with argAsIElement 
    } 
    if (arg is HtmlControl) 
    { 
    var argAsHtmlControl = arg as HtmlControl; 

    // Do something with argAsHtmlControl 
    } 
} 
+1

另一種解決方案是創建一個IElement的實現,它包裝一個HtmlControl(一個適配器)並在方法中使用T:IElement約束 – thecoop 2009-10-14 13:13:34

相關問題