2012-12-06 12 views
5

私はオートメーションコードにジェネリックスを導入しようとしていますので、WpfControlをWpfControlタイプに制約されているジェネリックタイプTにキャストしようとしています。私はそれがnullを返すジェネリック型に型WpfControlのあるコントロールをキャストしていたときにコード化されたUIダウンキャスティングが動作しないことをテストします

return control as T; 

Tは常にまだWpfControlの子になります。これはまだnullを返し

var childControl = control as WpfTabList; 

:私はまた、例えば、正確な子のタイプに制御をキャストするようなものを試してみました。誰でも似たような問題が発生しますか?

まず、あなたは一般的な方法geteric型指定を使用してください:

このWpfControl Class

+1

すべてがあなたの説明どおりであれば、それはうまくいくはずです。私はあなたが行方不明のものがあると思う。私はあなたにお勧めします:a)デバッガでステップスルーし、実行時に "コントロール"の種類を確認し、b)より完全なコードを投稿してください。 –

+1

また、コントロールがnullでないことを確認してください!それは前に私を捕まえた。 –

+0

コンストラクタを呼び出す行はどこに追加してください。 )もしあなたがその行を見つけたら、おそらくそれをあなた自身で解決するだろう;しかし、そうでなければ私はまだここにいる) –

答えて

0

いくつかのアーティスト同士のコラボレーションを参照してください。

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

あなたの仮定のmisconsistnaceがあるとimplemtation のようなあなたは、子コントロールがTabListないときWpfControl例で間違っているWpfTabListに一致するようにしようとしています。

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>(); 
    } 

最も可能性が高い場合には、コントロールの種類は、あなたがするか、それがNULLであること、それをキャストしようとしているものではないということです。

関連する問題