私はC#の行を持っています:
cats.Add(new Cat("happy") { Mean=false})
Cat を変更してから、次のように平均を適用します。
cats.Add(Fix(new Cat("happy")) { Mean=false})
しかし、私はできません。上記を機能させるために、Fix() メソッドはどのようにすべきでしょうか?
そのようには機能しません。は初期化子であり、コンストラクターの周りで 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 }));
上記は不可です。オブジェクト初期化子は、任意のインスタンスではなく、コンストラクターと一緒にのみ使用できます。一時変数を作成する必要があります。
var nonMeanCat = Fix(new Cat("happy"));
nonMeanCat.Mean = false;
cats.Add(nonMeanCat);
または、流暢な設計をサポートするには、プロパティの明示的なアクセサ メソッドを追加します (例:IsMean()
および ) Mean(bool)
。