我得到几行代码,其中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;
}
}
答案 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“让你高兴的是。