对于MEF案例,使用System.Action <t>的Lambda表达式示例?</t>

时间:2010-01-22 17:59:05

标签: .net-3.5 lambda mef

我是System.Action的新手&lt; T&gt;和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&lt; CompositionBatch&gt; action)用于将MEF目录部件初始化为CompositionBatch实例,该实例添加所有导入和导出部件。之后,批处理组成容器以解析所有DI映射。

我不确定我是否使用System.Action&lt; T&gt;和Lambda表达式在这里正确。在这个例子中,x是否会由Composition()CTOR动态创建吗?我应该在方法Initialize()中添加任何内容吗?或者我应该创建一个委托作为Initialize()(如果是这样,我认为我仍然需要将它绑定到一个方法)?

1 个答案:

答案 0 :(得分:1)

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

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

注意现在你实际上如何调用传递给函数的方法。此外,你的构造函数中有一个拼写错误(初始化而不是初始化),我没有看到声明instance1instance2的位置。

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