Lambda和action delegate的使用

时间:2012-12-10 06:45:34

标签: c# lambda

我得到几行代码,其中configure方法正在调用并且只传递字符串值但是ConfigureWith函数需要委托。任何人都可以帮助我理解ConfigureWith()方法将如何工作。感谢

MailTemplate
.ConfigureWith(mt => mt.MailBody = "hello world")
.ConfigureWith(mt => mt.MailFrom = "rdingwall@gmail.com")
.DoSomeOtherStuff()
.Build();

这方面的实施将是:

public class MailTemplate
{
// regular auto properties
public string MailFrom { get; set; }
public string MailBody { get; set; }

public MailTemplate ConfigureWith(Action<MailTemplate> func)
{
    func(this);
    return this;
}


}

2 个答案:

答案 0 :(得分:3)

如上所述,它似乎完全没有意义,您也可以直接在MailTemplate上设置属性。

通常在这样的流畅构建器中,您将保存每次ConfigureWith调用时传入的操作,然后再执行它们。

如果您使用您正在创建的流利语法更详细地解释您希望实现的目标,这可能会有所帮助。由于编写它也不会编译,因为第一次调用需要一个静态方法。你能展示一下真正的代码吗?

您可能还想查看StackOverflow关于流畅方法的其他答案(例如Tips for writing fluent interfaces in C# 3

答案 1 :(得分:0)

我看到上面的示例来自您之前提到的different question的答案。我仍然不完全确定你要做什么,正如Ian Mercer建议的那样,写起来毫无意义。但是,如果你只是想了解它所做的 ,那么让我们首先得到一个有效的例子:

using System;

namespace ScratchApp
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var mailTemplate = BuildMailTemplate(
                mt => mt.MailBody = "hello world", 
                mt => mt.MailFrom = "rdingwall@gmail.com");
        }

        private static MailTemplate BuildMailTemplate(
            Action<MailTemplate> configAction1, 
            Action<MailTemplate> configAction2)
        {
            var mailTemplate = new MailTemplate();
            mailTemplate.ConfigureWith(configAction1)
                .ConfigureWith(configAction2)
                .DoSomeOtherStuff()
                .Build();
            return mailTemplate;
        }
    }

    public class MailTemplate
    {
        public string MailFrom { get; set; }
        public string MailBody { get; set; }

        public MailTemplate DoSomeOtherStuff()
        {
            // Do something
            return this;
        }

        public MailTemplate Build()
        {
            // Build something
            return this;
        }

        public MailTemplate ConfigureWith(Action<MailTemplate> func)
        {
            func(this);
            return this;
        }
    }
}

这和以前一样毫无意义,但它构建了。当你调用时会发生什么.ConfigureWith()是传递一个函数而不是传递一个正常值。在上面的示例中,我实际上将函数声明为传递给BuildMailTemplate()方法的参数,然后在构建和配置模板时执行这些参数。您可以通过逐行遍历代码(例如,Visual Studio中的F11),并在lambda表达式中设置断点 来了解它的工作原理,然后查看调用堆栈。

如果你对lambdas的语法感到困惑 - 当你第一次习惯时,箭头语法确实有点复杂 - 那么请随时查看它上面的MSDN article,或者只是Google“ c#lambdas“让你高兴的是。