繼承

2012-05-30 106 views
0

獲取基類,我想從繼承

public class Class1 : BrowserWindow 

我試圖在UiBrowserWindow通過方法「轉換」成Class1得到UiBrowserWindow基類。事情是這樣的......

public class UiBrowserWindow : Microsoft.VisualStudio.TestTools.UITesting.BrowserWindow { 
    public static UiBrowserWindow Convert(Microsoft.VisualStudio.TestTools.UITesting.BrowserWindow browserWindow) { 
     UiBrowserWindow result = new UiBrowserWindow(); 
     result = (UiBrowserWindow)browserWindow; 
     return result; 
    } 
} 

UiBrowserWindow browserWindow = UiBrowserWindow.Convert(UIMap.Class1.GetType().BaseType); 
//UIMap.Class1 is a property of UIMap 

此代碼將產生錯誤Argument type 'System.Type' is not assignable to parameter type 'Microsoft.VisualStudio.TestTools.UITesting.BrowserWindow'

更新的代碼:

public class UiBrowserWindow : Microsoft.VisualStudio.TestTools.UITesting.BrowserWindow { 
    public static UiBrowserWindow convert(Microsoft.VisualStudio.TestTools.UITesting.BrowserWindow browserWindow) { 
     UiBrowserWindow result = (UiBrowserWindow)browserWindow; 
     return result; 
    } 
} 

// Usage... 
UiBrowserWindow browserWindow = UiBrowserWindow.convert(UIMap.Class1); 

這是引起異常InvalidCastException: Unable to cast object of type 'automatedTesting.Class1' to type 'UiBrowserWindow'

TestMethod的...

[TestMethod] 
public void CodedUITestMethod1() { 
    this.UIMap.RecordedMethod1(); 

    UiBrowserWindow browserWindow = UiBrowserWindow.convert(UIMap.Class1); 
    Assert.IsNotNull(browserWindow.getUiTestControl<HtmlDiv>(new[] { 
     new PropertyExpression(HtmlDiv.PropertyNames.Id, "logo") 
    })); 
} 
+1

請勿使用反射。查看Novakov的答案:「Class1」類型的對象總是「可分配給」BrowserWindow類型。這就是繼承(基類)的全部內容。另外:在你的'Convert'方法中,不要將'result'賦給一個你不打算使用的'new UiBrowserWindow'。只需刪除那個「新」表達式。 –

回答

2

我想,你應該忽略 「.GetType()基本類型。」 的一部分,並呼籲:

UiBrowserWindow browserWindow = UiBrowserWindow.Convert(UIMap.Class1); 

更新: 的Class1從BrowserWindow派生,UiBrowserWindow從BrowserWindow派生。 Class1不是UiBrowserWindow。您正在嘗試的轉換僅適用於重載轉換運算符(但我不推薦它)。解釋你要達到的目標,因爲這種方式不起作用

+0

這導致了一個異常'InvalidCastException:無法強制類型'automatedTesting.Class1'的對象類型'UiBrowserWindow'' – bflemi3

+0

'Class1'是一個由VS2010中的編碼UI測試生成器自動生成的類。我們已經有了一個框架,可以通過代碼創建編碼的ui測試。我想要做的是允許用戶記錄一個TestMethod,然後使用我們的框架編寫他們自己的斷言,但爲了做到這一點,自動生成的'BrowserWindow'包裝類(本例中爲'Class1')需要轉換成我們的包裝類「UiBrowserWindow」。我將添加上面的TestMethod以進行澄清 – bflemi3

+0

與'UiBrowserWindow'類似,'Class1'爲您提供了一個瀏覽器句柄。 – bflemi3

1

有一個標準的C#方式來做到這一點。請參閱MSDN

+0

我很疑惑什麼時候會使用隱式或顯式。你能詳細解釋一下嗎?也許是一個例子 – bflemi3

+0

在你的情況下,你有UiBrowserWindow bw = CONVERSION GOES HERE ...因爲你知道類型是Class1,所以你可以隱式地轉換它。唯一的問題是,由於運算符重載和做猴子業務,您的代碼可讀性會降低。最簡單的就是UiBrowserWindow bw = UIMap.Class1;但讀起來很奇怪。 –

+0

我不會總是知道要轉換的類是什麼(Class1),並且從我的研究中,c#不會執行通用運算符。如果我不知道類型,除了它會實現'BrowserWindow',有沒有辦法讓這個工作? – bflemi3