继承属性的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; }
}
现在,Window
和ScrollViewer
都继承了ContentControl
的Content
属性。然而,我不得不分别为每个类定义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
,并让它做"正确的事情",以避免定义许多除了类型之外相似的单独专用方法?
您可以使用泛型:
public static TControl SetContent<TControl>(this TControl obj, object val)
where TControl : ContentControl
{
obj.Content = val;
return obj;
}
我不认为在创建新控件时有多大好处,因为您也可以使用初始化器:
new Window() {
Content = new ScrollViewer() { Content = ... }
};