Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# void函数上的强制速记链式表达式?_C# - Fatal编程技术网

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