C# void函数上的强制速记链式表达式?
我想买一个C# void函数上的强制速记链式表达式?,c#,C#,我想买一个 var form = getForm(); //returns Form type form.Show(); form.BringToFront(); 并尽可能地简化。不幸的是,我无法像在LINQ中那样链接表达式,因为Show()和BringToFront()不会返回原始表单对象。有没有一种方法可以绕过这个问题,生成如下代码: getForm().Show().BringToFront() 扩展方法可能适用于表单,但在这种特殊情况下,getForm()返回表单的子类 publi
var form = getForm(); //returns Form type
form.Show();
form.BringToFront();
并尽可能地简化。不幸的是,我无法像在LINQ中那样链接表达式,因为Show()
和BringToFront()
不会返回原始表单对象。有没有一种方法可以绕过这个问题,生成如下代码:
getForm().Show().BringToFront()
扩展方法可能适用于表单,但在这种特殊情况下,getForm()
返回表单的子类
public static class FluentExtensions
{
public static T FluentInvoke<T>(this T o, Action<T> toInvoke)
{
toInvoke(o);
return o;
}
}
或者在您的情况下:
getForm().FluentInvoke(z => z.Show()).FluentInvoke(z => z.BringToFront());
像这样的扩展可能:
public static T Do<T>(this T obj, params Action<T>[] actions)
{
foreach(var action in actions)
action(obj);
return obj;
}
您还可以在不链接的情况下执行多个操作:
getForm().Do(f => f.Show(), f => f.BringToFront());
通过将扩展方法转为泛型,可以使扩展方法有效:
T ShowForm<T>(this T form) where T : Form {
form.Show();
return form;
}
仅仅因为您的
getForm()
方法返回了Form
的子类,并不意味着您不能创建扩展方法。您只需将其设置为表单
类。这将把它放在项目中表单
类的所有派生上
public static class FormExtensions
{
// Slightly shorter name
public static Form ShowAndFront(this Form form)
{
form.Show();
form.BringToFront();
return form;
}
}
添加ShowAndBringToFront()方法?这是一个解决方案,但我会为我想要的每个链式表达式编写一个函数。“getForm()返回表单的子类”。为什么这会使扩展方法变得不适用?@在我刚刚编辑的过程中,我错误地认为扩展方法不能像我以前尝试的那样在子类上工作,但另一个发布的问题将我引入歧途。更好的方法可能是
返回表单代码>作为最后一行?@mjwills打得不错!我以前有过,但我做错了。然而,链接表达式的方法比编写更多扩展要有趣得多functions@Zorgarath但在void方法上不能这样做。直到WinForms失宠,流畅的语法才被创建(至少在C#中是这样)。正因为如此,他们从未更新过库以消除返回表单对象的大多数方法。有什么比WinForms更好的方法可以使用吗?现在他需要对表单执行第三个操作,然后呢?@TimSchmelter如果OP想要链接不可链接的方法,他需要为所有方法提供包装。
T ShowForm<T>(this T form) where T : Form {
form.Show();
return form;
}
GetForm().ShowForm().BringToFront();
public static class FormExtensions
{
// Slightly shorter name
public static Form ShowAndFront(this Form form)
{
form.Show();
form.BringToFront();
return form;
}
}