-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の他の回答も確認することをお勧めします(例:C#3で流暢なインターフェイスを作成するためのヒント

于 2012-12-10T06:55:46.217 に答える
0

上記の例は、前に尋ねた別の質問への回答からのものであることがわかります。私はあなたが何をしようとしているのかまだ完全にはわかりません、そしてイアン・マーサーが示唆したように、それは書かれているようにかなり無意味です。しかし、それがをするのかを理解しようとしているだけなら、最初に実用的な例を見てみましょう:

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()メソッドに渡され、テンプレートのビルドおよび構成時に実行されるパラメーターとして関数を宣言しています。コードを1行ずつ(たとえば、Visual StudioのF11)ステップ実行し、ラムダ式自体にブレークポイントを設定してから、呼び出しスタックを確認することで、どのように機能するかを理解できます。

ラムダの構文について混乱している場合(矢印の構文は、最初に慣れたときには確かに少し複雑です)、MSDNの記事をチェックするか、Googleの「c#ラムダ」を心からチェックしてください。喜び。

于 2012-12-10T08:52:09.317 に答える