1

System.Action<T>とLambda式は初めてです。これが私が使いたい1つのケースです。

using System;
using System.ComponentModel.Composition;
public class MyClass {
   public static CompositionContainer Container = new CompositionContainer();

   private void Initialize(Action<CompositonBatch> action) {}

   public MyClass() {
      CompositionBatch batch = null;
      inititialize(x=> {
          // create catalog instances: instance1 and instance2 as example
          // ...
          x.AddPart(instance1);
          x.AddPart(instance2);
          batch = x;
       });
       // at this point, will be batch be none-null value will parts added?

       // the following code is composing batch to the container
       Container.Compose(batch);
   }
}

基本的に、メソッドInitialize(Action <CompositionBatch> action)は、MEFカタログパーツをCompositionBatchインスタンスに初期化するために使用されます。これにより、すべてのインポートパーツとエクスポートパーツが追加されます。その後、すべてのDIマッピングを解決するために、バッチがコンテナーに構成されます。

ここでSystem.Action<T>とLambda式を正しく使用しているかどうかはわかりません。この例では、xはComposition()CTORによってオンフライで作成されますか?Initialize()メソッドに何かを入れる必要がありますか?または、代わりにInitialize()としてデリゲートを作成する必要がありますか(そうであれば、それをメソッドにバインドする必要があると思います)?

4

1 に答える 1

1

ここでの問題は、ラムダ式を呼び出さないことです。Initialize()これを行うには、次のようにメソッドを変更する必要があります。

private void Initialize(Action<CompositonBatch> action) {action(new Composition());}

関数に渡すメソッドを実際に呼び出す方法に注意してください。また、コンストラクターにタイプミスがあり(初期化ではなく初期化)、どこinstance1instance2宣言されているのかわかりません。

しかし、ここで本当に何かを得ることができるかどうかはわかりません。batchまた、これにより変数がクロージャになることにも注意してください。

于 2010-01-22T18:07:31.617 に答える