2012-12-06 30 views
5

我一直在嘗試將泛型引入到我們的自動化代碼,所以我試圖將WpfControl轉換爲泛型類型T,其中T被限制爲WpfControl類型。編碼的UI測試下來鑄造不工作

return control as T; 

T將永遠是WpfControl的孩子然而,當我在連鑄控制它的類型是WpfControl給它返回null泛型類型。我也曾嘗試投控制的確切孩子類型例如類似:

var childControl = control as WpfTabList; 

這仍然返回null。任何人遇到類似的問題?

看到這個WpfControl Class

+1

如果一切都如您所描述的那麼它應該工作。我懷疑你有什麼遺漏。我可以建議你:a)在調試器中逐步查看「控制」在運行時的類型,以及b)發佈更完整的代碼。 –

+1

另請檢查該控件是否爲空!那是我以前抓到的。 –

+0

其中調用構造函數的行 - 請問您可以添加它嗎? (控制=新....)你可能會自己解決它,當你找到該行;)(但如果不是 - 我還在這裏) –

回答

0

一些recomendations:

首先,在你泛型方法請使用geteric類型規範。像

public T GetControl<T>(...) where T : WpfControl 

有你的假設一個misconsistnace和implemtation 你試圖當一個孩子的控制是不是一個標籤列表,以匹配WpfControlWpfTabList這是錯誤的案件。

0

這絕對有效。我有一整套這些在我的github

你可以添加更多的代碼來顯示控件的設置嗎?

下面是一些摘錄,顯示這可能看起來像什麼。

public static T Find<T>(this UITestControl parent) where T : UITestControl, new() 
    { 
     return new T() { Container = parent }; 
    } 

public static IEnumerable<T> FindAll<T>(this UITestControl parent) where T : UITestControl, new() 
    { 
     return parent.Find<T>().FindAllAsType(); 
    } 

private static IEnumerable<T> FindAllAsType<T>(this T current) where T : UITestControl, new() 
    { 
     if (typeof(T).IsSubclassOf(typeof(HtmlControl))) 
     { 
      return current.FindMatchingControls().Select(x => new T().ExtendFrom(x)); 
     } 
     return current.FindMatchingControls().OfType<T>(); 
    } 

private static IEnumerable<U> FindAllCastTo<T, U>(this T current) where T : UITestControl 
    { 
     return current.FindMatchingControls().Cast<U>(); 
    } 

最有可能的情況是,控件類型不是您要將其投射到它或它是空的。