2012-01-24 2 views
0

간혹 "유창한"방식으로 작성하고 싶은 WPF C# 코드가 있습니다.상속 된 속성에 대한 Fluent WPF API

예를 들어, 내가 설정 이럴땐 Window 포함하는 ScrollViewer :

static class FluentScrollViewer 
{ 
    public static ScrollViewer SetContent(this ScrollViewer obj, object val) 
    { obj.Content = val; return obj; } 
} 

static class FluentWindow 
{ 
    public static Window SetContent(this Window obj, object val) 
    { obj.Content = val; return obj; } 
} 

:

new Window() 
    .SetContent(
     new ScrollViewer() 
      .SetContent(
       ...)) 

, 나는 이와 같은 확장 방법을 사용하고 API의 종류를 달성하기 위해 이제 WindowScrollViewerContentControl에서 Content 속성을 상속합니다. 그러나 각 클래스에 대해 SetContent 확장 메서드를 별도로 정의해야했습니다.

static class FluentContentControl 
{ 
    public static ContentControl SetContent(this ContentControl obj, object val) 
    { obj.Content = val; return obj; } 
} 

을 다음과 같이 사용 : :이 대신 같은 뭔가를하려고하면

new Window().SetContent(...) 

SetContent 방법은 물론 Window을 반환하지 않습니다.

ContentControl을 통해 SetContent을 정의하고 유형을 제외하고는 유사한 개별적으로 speciallized 된 메소드를 많이 정의하지 않도록 "올바른 일"을 수행 할 수 있습니까?

+0

가능한 중복 [ Fluent 인터페이스 및 상속 C#] (http://stackoverflow.com/questions/2278781/fluent-interfaces-and-inheritance-in-c-sharp) – dharmatech

답변

2

당신이 사용할 수있는 제네릭 :

당신은 또한 사용할 수있는대로 새 컨트롤을 만드는이 훨씬 이득이 없다고 생각
public static TControl SetContent<TControl>(this TControl obj, object val) 
where TControl : ContentControl 
{ 
    obj.Content = val; 
    return obj; 
} 
+0

Piotr 감사합니다! 완벽하게 작동합니다! – dharmatech

1

initializers :

new Window() { 
    Content = new ScrollViewer() { Content = ... } 
}; 
+0

+1 초기화 프로그램은 긴 호출의 긴 체인보다 훨씬 읽기 쉽습니다. –

+0

그러나 초기화 도구는 기존 개체의 속성을 설정하는 데 도움이되지 않습니다. – dharmatech

+0

@dharmatech : 내가 말했듯이 이것은 새로운 컨트롤을 만드는 데에만 적용됩니다. 필자의 대답은 Piotr이 이미이 메소드를 일반적인 방법으로 작성한 방법에 대한 답변으로이 특별한 경우를 추가 한 것입니다. –