1

Ok。だから私は値のリストを持っています、そして私は次のようなことをしたいと思います:

MyObjectValues
.Select(currentItems=>new MyType()
{
     Parameter1 = currentItems.Value1,
     Parameter2 = currentItems.Value2
});

ここで問題です。次のような名前付きコンストラクターを操作するには、上記の例が必要です。

MyObjectValues
.Select(currentItems=>MyType.GetNewInstance()
{
     Parameter1 = currentItems.Value1,
     Parameter2 = currentItems.Value2
});

それを行う方法はありますか?基本的に、オブジェクト インスタンスを取得するために呼び出す必要がある静的メソッドがあり、上記のように初期化したいと考えています。

編集: 現時点では MyType のインターフェイスを変更する簡単な方法がないため、新しい関数呼び出しを追加することは (おそらく「最善の」アプローチですが) 現時点ではあまり実用的ではありません。

4

3 に答える 3

2

残念ながら、C# 3.0 ではこれを直接サポートしていません。オブジェクト初期化子は、コンストラクター呼び出しでのみサポートされています。ただし、Builder パターンを検討することもできます。私の Protocol Buffers ポートでは、次のようにサポートしています。

MyType foo = new MyType.Builder {Parameter1 = 10, Parameter2 = 20}.Build();

したがって、あなたの例は次のようになります。

MyObjectValues.Select(currentItems => new MyType.Builder
{
     Parameter1 = currentItems.Value1,
     Parameter2 = currentItems.Value2
}.Build());

もちろん、これはネストされた Builder 型を記述することを意味しますが、非常にうまく機能します。MyType が厳密に言えば変更可能であることを気にしない場合は、不変の API をそのままにして、 のインスタンスをBuilderすぐに の新しいインスタンスを作成し、MyTypeプロパティをそのまま設定して (プライベート メンバーにアクセスできるため)、最後に返すことができます。メソッドMyType内ののインスタンスBuild()。(インスタンスを「忘れる」必要があるため、それ以上の変更は禁止されます。)

于 2009-03-06T21:34:53.230 に答える
2

誰かが 4.0 より前の C# でそれを行う賢い方法を考えると確信していますが、C# 4.0 の名前付きパラメーターに関する Sam Ng のブログ投稿を読んだところです。これで問題が解決するはずです。次のようになります。

MyObjectValues.Select(currentItems=>MyType.GetNewInstance(
    Parameter1:currentItems.Value1,
    Parameter2:currentItems.Value2));

編集

言い忘れましたが、これが便利なのは、パラメーターのデフォルトを設定できるため、すべてを渡す必要がないことです。ブログ投稿は短い要約です。

于 2009-03-06T21:30:54.830 に答える
1

更新:工場はどうですか:

MyObjectValues.Select(currentItems=>MyTypeFactory.GetNewInstance(currentItems.Value1,
currentItems.Value2));


public static class MyTypeFactory
{
    public static MyType GetNewInstance(
         typeofvalue1 value1, 
         typeofvalue2 value2)
    {
        return new MyType { Parameter1 = value1, Parameter2 = value2 };
    }
}
于 2009-03-06T21:33:36.103 に答える