-1

我有几行代码,其中 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;
}


}
4

2 回答 2

3

写的好像完全没有意义,你还不如直接设置属性就行了MailTemplate

通常在像这样的流利的构建器中,您会保存每次ConfigureWith调用传入的操作,然后稍后执行它们。

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

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

于 2012-12-10T06:55:46.217 回答
0

我看到上面的示例来自对您之前提出的另一个问题的回答。我仍然不完全确定您要做什么,并且正如 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 文章,或者只是谷歌“c# lambdas”。喜。

于 2012-12-10T08:52:09.317 回答