2009-03-06 11 views
1

だから、私は値のリストを持っています。次のようなことをしたいと思います。オブジェクトの初期化と "名前付きコンストラクタイディオム"

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

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

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

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

EDIT:現時点ではMyTypeのインターフェイスを簡単に変更することはできないため、新しい機能呼び出し(おそらく「最良の」アプローチ)を追加することはあまり現実的ではありません。

答えて

1

。オブジェクトの初期化子はで、コンストラクタ呼び出しではのみがサポートされています。ただし、Builderパターンを考慮する必要があります。

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の新しいインスタンスを作成し、プロパティをプライベートメンバーにアクセスできるように設定します。最後にBuild()メソッドでMyTypeのインスタンスを返します。 (インスタンスを "忘れる"ため、さらなる突然変異は禁止されます)。

2

誰かが4.0より前のC#でそれを行う巧妙な方法を考えていると確信していますが、私はちょうどSam Ng's blog post on named parameters in C# 4.0を読んでいます。これはあなたの問題を解決するはずです。それは次のようになります言及する

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

EDIT

Fogot、何これは便利になることは、あなたがそれらすべてを渡す必要はありませんので、あなたは、パラメータのデフォルト値を設定することができるということです。ブログ記事は簡単な要約です。

+0

到着時に役立ちます。 – GWLlosa

1

更新:どの工場について:残念ながら、この中にC#3.0のための直接的なサポートはありません

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 }; 
    } 
} 
+0

このインスタンスでMyTypeの実装を実際に変更する簡単な方法はありません。 – GWLlosa

+0

工場では、MyTypeを変更する必要はなく、MyTypeFactoryのみを実装します –

関連する問題