3

この質問にタイトルを付ける方法が正確にわからないので、タイトルがうまくいくことを願っています。

問題は、メソッド呼び出しで暗黙の型構文に似たものを使用できるかどうかです。たとえば、これは私が参照している暗黙的な型の構文です。

var x = new Y(){Foo = "Bar", Id = 1};

そして、私はこのようなことをしたい:

var x = myInstance.CreateItem(){Foo = "Bar", Id = 1};

このようなものをサポートする C# はありますか? 私はしたくない:

x.Foo = "Bar";
x.Id = 1;
...

CreateItem は動的な型を返すことに注意してください。CreateItem メソッドとそのクラスは変更できません。

VB の With ステートメントに似たもので解決します。

前もって感謝します。

更新: マーク ブラケットの解決策を試みると、次のコードが得られました。

TaskItem item = outlook.CreateItem(OlItemType.olTaskItem)._((Action<dynamic>)(i => 
            {
                i.Subject = "New Task";
                i.StartDate = DateTime.Now;
                i.DueDate = DateTime.Now.AddDays(1);
                i.ReminderSet = false;
                i.Categories = "@Work";
                i.Sensitivity = OlSensitivity.olPrivate;
                i.Display = true;

            }));

...

public static class Extension
{
    public static T _<T>(this T o, System.Action<dynamic> initialize) where T : class
    {
        initialize(o);
        return o;
    }

}

唯一の問題は、次のエラーが発生するため、拡張メソッドが System._ ComObject にバインドされていないように見えることです: System. _ComObject' には '_' の定義が含まれていません。

4

3 に答える 3

2

これは「オブジェクト初期化子」newと呼ばれますが、いいえ - 戻り値には使用できません (実際には、ステートメント以外ではいつでも使用できます)。

構文的には、私が考えることができる最も近いものは、Actionデリゲートを使用することです (これには への変更が必要Builderです):

MyItem CreateItem(Action<MyItem> afterCreate) {
   var i = new MyItem();
   if (afterCreate != null) afterCreate(i);
   return i;
}

var x = Builder.CreateItem(i => { i.Foo = "Bar"; i.Id = 1; });

一般的に使用される関数の短いメソッド名が必要な JavaScript 気分で、 を変更できない場合はBuilder、拡張メソッドも機能すると思います。

public static T _<T>(this T o, Action<T> initialize) where T : class {
    initialize(o);
    return o;
}

var x = Builder.CreateItem()._(i => { i.Foo = "Bar"; i.Id = 1; });

ここにひねりがあります。CreateItem() は動的タイプを返します

私のコメントに反してdynamic、いくつかの変更が必要です。にキャストする必要があるobjectか、ラムダが文句を言う必要があります。次に、dynamicasを指定する必要がありTますobjectAction<dynamic>または、型引数を指定して、または指定せずに拡張メソッドを作成します。

object CreateItem() {
    return (object)Builder.CreateItem();
}

public static dynamic __(this object o, Action<dynamic> initialize) {
    initialize(o);
    return o;
}

var x = CreateItem().__(i => { i.Foo = "Bar"; i.Id = 1; });
于 2012-05-18T22:19:15.893 に答える
1

ファクトリ メソッドに名前付き引数を使用できます。

public static Y Builder.CreateItem(string foo = "", int bar = 0)
{
    return new Y() {Foo = foo, Bar = bar};
}

// called like so:
var x = Builder.CreateItem(Foo: "Bar", Id: 1);
于 2012-05-18T22:35:38.577 に答える
0

クラスのコンストラクターで「パブリック プロパティ」を指定できますが、メソッドでそれを行うことはできません

なぜなら

  • この規則は、メソッドでは不可能なメンバー プロパティにのみ適用されます

  • メソッドのフィールドに public modofier を与えることはできないので、まったく可能性はありません

あなたがするとき

var a = new MyClass{Foo="",Id=""};

このコンストラクタ MyClass() のクラスのプロパティを定義しています

静的またはインスタンスメソッドではそれを行うことはできません

于 2012-05-18T22:16:19.420 に答える