继承属性的Fluent WPF API

本文关键字:WPF API Fluent 属性 继承 | 更新日期: 2023-09-27 18:21:26

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

例如,我可能想设置一个包含ScrollViewer:的Window

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

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

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

现在,WindowScrollViewer都继承了ContentControlContent属性。然而,我不得不分别为每个类定义SetContent扩展方法。

如果我试着这样做:

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

然后像这样使用:

new Window().SetContent(...)

CCD_ 8方法当然不返回CCD_。

有没有办法在ContentControl之上定义SetContent,并让它做"正确的事情",以避免定义许多除了类型之外相似的单独专用方法?

继承属性的Fluent WPF API

您可以使用泛型:

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

我不认为在创建新控件时有多大好处,因为您也可以使用初始化器:

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