2009-10-01 391 views
0

我需要在C#代碼(與ilGenerator.Emit)模擬下列功能轉換C#代碼

public void AssignAttribute(ref ValueHolder output, Assignment assignment) { 
    ResultAttribute attribute = null; 

    if ((attribute = output.MultipleResults.Find(delegate(ResultAttribute o) { 
     return o.Name == assignment.Name; 
    })) != null) 
     attribute.Value = assignment.Value; 
    } 

任何人可以幫助我嗎?

回答

7

做的事情是編譯的方法,在項目C#,然後在它生成使用Reflector裝配看看IL。您可以使用的Emit容易複製,白細胞介素,使你所需要的任何動態變化。

+0

Jonathan de Halleux爲反射器寫了一個Reflection.Emit語言加載項(http://reflectoraddins.codeplex.com/Wiki/View.aspx?title=ReflectionEmitLanguage),使這種類型事情更容易。這不是很完美,但它通常會得到你的存在方式,這是一個很大赫克比純IL開始更好的約95%... – 2009-10-01 11:38:25

1

C#創建一個閉包(參見維基百科,如果你不熟悉),你因爲你參考變量賦值匿名方法體(這是你的情況參數,但這個並不重要)。

您需要創建一個類持有人的匿名委託(至少C#編譯器做到這一點)

,那麼你需要在這個類來創建領域,因爲你代表closeover(我不是以英語爲母語所以這裏可能拼寫錯誤) 分配分配參數

然後在AssignAttribute體,你應該發出類實例化的 IL_0000:newobj實例空隙V24.Generated.Worker /」 <> c__DisplayClass1' ::構造函數()

以及費爾德分配換貨 IL_0008:stfld類[nviss] NViss.Assignment V24.Generated.Worker /」 <> c__DisplayClass1' ::分配

注意,由於申請初始化完成隨時隨地訪問本地變量的訪問更換到現場

再次對不起我的英語