2012-12-06 3 views
5

저는 자동화 코드에 제네릭을 도입하려고 시도 했으므로 WpfControl을 Tp 유형으로 제한하고 WpfControl을 WpfControl 유형으로 캐스팅하려고합니다. 나는 그것이 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

약간의 recomendations를 참조하십시오.

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

당신의 가정에 misconsistnace이와 implemtation 같은 당신은 자식 컨트롤이 tablist에서 아닌 경우 WpfControl가지 경우에 잘못 WpfTabList A와 일치하도록 노력하고 있습니다.

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 인 경우입니다.

관련 문제