如何使用带有c#属性声明的Fluent样式语法糖

Tho*_*mas 2 c# fluent

我之前从未使用过流畅的代码风格.所以这是我第一次尝试使用C#属性声明以流畅的方式开发一些东西,但是我收到了一个错误.谁能帮我?

public class MailTemplate
{
    string _MailBody = "";
    public MailTemplate MailBody
    {
        get { return _MailBody; }
        set { _MailBody = value ; }
    }

    string _Subject = "";
    public MailTemplate Subject
    {
        get { return _Subject; }
        set { _Subject = value; }
    }

    string _MailFrom = "";
    public MailTemplate MailFrom
    {
        get { return _MailFrom; }
        set { _MailFrom = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

请帮助我如何分配或初始化邮件正文,以后也可以阅读相同的属性名称.我认为一个属性不能用于流畅的风格开发.这里需要一些亮点.

Dan*_*rth 5

MailTemplate该类的流畅构建器界面如下所示:

public class MailTemplateBuilder
{
    string _body;
    string _subject;
    string _sender;

    public MailTemplateBuilder WithBody(string body)
    {
        _body = body;
        return this;
    }

    public MailTemplateBuilder WithSubject(string subject)
    {
        _subject = subject;
        return this;
    }

    public MailTemplateBuilder WithSender(string sender)
    {
        _sender = sender;
        return this;
    }

    public MailTemplate Build()
    {
        return new MailTemplate(_sender, _subject, _body);
    }
}
Run Code Online (Sandbox Code Playgroud)

用法如下所示:

var template = _builder.WithBody("body")
                       .WithSubject("subject")
                       .WithSender("sender")
                       .Build();
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用扩展方法:

public static class MailTemplateBuilder
{
    public static MailTemplate WithBody(this MailTemplate item, string body)
    {
        item.MailBody = body;
        return item;
    }

    public static MailTemplate WithSubject(this MailTemplate item, string subject)
    {
        item.MailSubject = subject;
        return item;
    }

    public static MailTemplate WithSender(this MailTemplate item, string sender)
    {
        item.MailFrom = sender;
        return item;
    }
}
Run Code Online (Sandbox Code Playgroud)

用法现在看起来像这样:

var template = new MailTemplate().WithBody("body")
                                 .WithSubject("subject")
                                 .WithSender("sender");
Run Code Online (Sandbox Code Playgroud)

请注意:
在这两种情况下,MailTemplate该类都不会受到此流畅界面的代码的污染.这将是一个简单的类:

public class MailTemplate
{
    string _mailBody = "";
    string _subject = "";
    string _mailFrom = "";

    public string MailBody
    {
        get { return _mailBody; }
        set { _mailBody = value ; }
    }

    public string Subject
    {
        get { return _subject; }
        set { _subject = value; }
    }

    public string MailFrom
    {
        get { return _mailFrom; }
        set { _mailFrom = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,在使用任何一个提供的流畅接口创建该实例后,您只需通过访问属性来读取值:

var body = template.MailBody;
Run Code Online (Sandbox Code Playgroud)