在void函数上强制使用速记链式表达式?

时间:2017-06-26 12:45:35

标签: c#

我想

var form = getForm();  //returns Form type
form.Show();
form.BringToFront();

尽可能让它变得简短。不幸的是,由于Show()BringToFront()没有返回原始的Form对象,因此无法在LINQ中链接表达式。有没有办法解决这个问题,产生如下代码:

getForm().Show().BringToFront()

Extension方法可能适用于Form,但在这种特殊情况下,getForm()返回Form的子类。

4 个答案:

答案 0 :(得分:2)

像这个扩展名的东西可能是:

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()).Do(f => f.BringToFront());

您还可以在不进行链接的情况下执行多项操作:

getForm().Do(f => f.Show(), f => f.BringToFront());

答案 1 :(得分:2)

仅仅因为您的Optional("{\"Success\":\"No Active account found.\"}") 方法返回getForm()的子类并不意味着您无法创建扩展方法。您只需将其设置为Form类。这将把它放在项目中Form类的所有派生中。

Form

答案 2 :(得分:1)

public static class FluentExtensions
{
    public static T FluentInvoke<T>(this T o, Action<T> toInvoke)
    {
        toInvoke(o);
        return o;
    }
}

然后你就这样使用它(注意Sort通常不会返回List):

public class Program
{
    static void Main(string[] args)
    {
        var list = new List<int> {1, 3, 2};

        Console.WriteLine(string.Join(",", list.FluentInvoke(o => o.Sort())));

        Console.ReadLine();
    }
}

或在你的情况下:

getForm().FluentInvoke(z => z.Show()).FluentInvoke(z => z.BringToFront());

答案 3 :(得分:1)

您可以通过将扩展方法设为通用来使扩展方法方法起作用:

T ShowForm<T>(this T form) where T : Form {
    form.Show();
    return form;
}

现在你可以写

GetForm().ShowForm().BringToFront();