转换C#代码

时间:2009-10-01 09:36:44

标签: c# ilgenerator

我需要在C#代码中模拟(使用ilGenerator.Emit)以下函数

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;
    }

有人能帮助我吗?

2 个答案:

答案 0 :(得分:7)

要做的是在项目C#中编译该方法,然后使用Reflector查看它在它生成的程序集中的IL。您可以使用Emit轻松复制该IL,并进行所需的任何动态更改。

答案 1 :(得分:1)

c#为你创建一个闭包(如果你不熟悉的话,请参阅维基百科),因为在匿名方法体中你引用了赋值变量(在你的情况下这是参数,但这没关系)。

您需要为匿名委托创建类持有者(至少c#编译器会这样做)

然后你需要在这个类中创建字段,因为你的委托关闭(我不是英语,所以这里可能拼写错误) 分配分配参数

然后在AssignAttribute的主体中,您应该发出类实例 IL_0000:newobj instance void V24.Generated.Worker /'<> c__DisplayClass1'::。ctor()

以及分配 IL_0008:stfld class [nviss] NViss.Assignment V24.Generated.Worker /'<> c__DisplayClass1':: assignment

请注意,自从归档初始化完成后,对本地变量的访问权限被替换为访问字段

再次抱歉我的英文