1

我是 System.Action<T> 和 Lambda 表达式的新手。这是我想使用的一种情况。

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

这里的问题是你永远不会调用你的 lambda 表达式。为此,您需要Initialize()像这样更改方法:

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

请注意现在您如何实际调用传递给函数的方法。此外,您的构造函数中有一个错字(初始化而不是初始化),我没有看到在哪里声明instance1instance2声明。

但我不确定你真的在这里得到什么。另请注意,这将在batch变量上创建一个闭包。

于 2010-01-22T18:07:31.617 回答