3

私はC#の行を持っています:

cats.Add(new Cat("happy") { Mean=false})

Cat を変更してから、次のように平均を適用します。

cats.Add(Fix(new Cat("happy")) { Mean=false})

しかし、私はできません。上記を機能させるために、Fix() メソッドはどのようにすべきでしょうか?

4

3 に答える 3

4

そのようには機能しません。は初期化子であり、コンストラクターの周りで a を呼び出してから、結果のプロパティ/フィールドバインディングをnew X() { }呼び出して分割することはできません。Fix関数を呼び出す前に、プロパティ/フィールド バインディングを評価する必要Fixがあります。

あなたはこれをしなければならないでしょう:

public Cat Fix(Cat cat) { ... }

cats.Add(Fix(new Cat("happy") { Mean=false }));

または、次のような拡張メソッド:

public static class CatExtensions {
     public static Cat Fix(this Cat cat) { ... }
}

cats.Add(new Cat("happy") { Mean=false }.Fix());

または、もう少し冒険好きなら、動的型を受け入れることができます。

public Cat Fix(Cat cat, dynamic properties) { ... }

cats.Add(Fix(new Cat("happy"), new { Mean=false }));

// extension method:
public static class CatExtensions {
     public static Cat Fix(this Cat cat, dynamic properties) { ... }
}

cats.Add(new Cat("happy").Fix(new { Mean=false }));

または一般的な方法:

public Cat Fix<T>(Cat cat, T properties) { ... }

cats.Add(Fix(new Cat("happy"), new { Mean=false }));

// extension method:
public static class CatExtensions {
     public static Cat Fix<T>(this Cat cat, T properties) { ... }
}

cats.Add(new Cat("happy").Fix(new { Mean=false }));
于 2013-06-21T21:24:08.173 に答える
1

上記は不可です。オブジェクト初期化子は、任意のインスタンスではなく、コンストラクターと一緒にのみ使用できます。一時変数を作成する必要があります。

var nonMeanCat = Fix(new Cat("happy"));
nonMeanCat.Mean = false;
cats.Add(nonMeanCat);

または、流暢な設計をサポートするには、プロパティの明示的なアクセサ メソッドを追加します (例:IsMean()および ) Mean(bool)

于 2013-06-21T21:24:20.817 に答える