用于继承属性的流畅WPF API

时间:2012-01-24 07:30:32

标签: c# wpf fluent fluent-interface

偶尔我会有一些WPF C#代码,我想用一个流利的"#34;方式。

例如,我可能想要设置一个包含Window的{​​{1}}:

ScrollViewer

为了实现这种API,我一直在使用这些扩展方法:

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

现在,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; } } Window都继承了ScrollViewer的{​​{1}}属性。但是,我必须分别为每个类定义Content扩展方法。

如果我尝试做这样的事情:

ContentControl

然后像这样使用它:

SetContent

static class FluentContentControl { public static ContentControl SetContent(this ContentControl obj, object val) { obj.Content = val; return obj; } } 方法当然不会返回new Window().SetContent(...)

是否可以定义SetContent超过Window并让它执行"正确的事情"为了避免定义大量单独特殊的方法,除了类型?

之外,它们是相似的

2 个答案:

答案 0 :(得分:2)

您可以使用泛型:

public static TControl SetContent<TControl>(this TControl obj, object val)
where TControl : ContentControl
{ 
    obj.Content = val; 
    return obj; 
}

答案 1 :(得分:1)

我不认为在创建新控件时会有很多好处,因为您也可以使用initializers

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