2010-01-22 53 views
1

我是新來的System.Action <T>和Lambda表達式。這是我想要使用的一種情況。對於MEF情況,Lambda表達式示例與System.Action <T>?

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(動作<CompositionBatch>動作)被用來初始化MEF目錄份到CompositionBatch實例,這增加了所有的進口和出口部分。之後,該批次將被組合到容器中以解析所有DI映射。

我不知道是否在此處正確使用System.Action <T>和Lambda表達式。這個例子中x會由Composition()CTOR在運行中創建嗎?我應該在方法Initialize()中放置什麼?或者,我應該創建一個委託爲Initialize(),而不是(如果是這樣我認爲我仍然需要綁定到一個方法)?

回答

1

這裏的問題是,你永遠不會調用你的lambda表達式。要做到這一點,你需要改變你的Initialize()方法是這樣的:

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

注意你實際上現在怎麼稱呼你傳遞給函數的方法。另外,你的構造函數中有一個輸入錯誤(初始化而不是初始化),我沒有看到聲明的位置instance1instance2

但我不確定你在這裏真的獲得了什麼。另外值得警告的是,這將導致對batch變量的關閉。

+0

我編輯了我的密碼。我不確定你的意思是「關閉批處理變量」。我的理解是,在Initialize()的調用之後批處理不爲null,並且其中包含部分內容。你的意思是我需要將批次定義爲類級別var嗎? – 2010-01-22 18:20:57

+0

我得到錯誤的行動();在Initialize()方法中。它應該像「動作(新構圖())」;「代替? – 2010-01-22 18:25:05

+0

是的,應該這樣做。我會編輯我的答案。 – 2010-01-22 20:07:41