偶尔我会有一些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
并让它执行"正确的事情"为了避免定义大量单独特殊的方法,除了类型?
答案 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 = ... }
};