转换C#代码

转换C#代码,c#,ilgenerator,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.Nam

我需要用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;
    }

有人能帮我吗?

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

c#为您创建一个闭包(如果您不熟悉,请参阅wikipedia),因为在匿名方法体中,您引用了赋值变量(在您的情况下,它是参数,但这并不重要)

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

然后,您需要在这个类中创建字段,因为您的代理关闭了(我不是英语母语,所以这里可能拼写错误) 赋值参数

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

还有我的任务 IL_0008:stfld类[nviss]nviss.Assignment V24.Generated.Worker/'c__DisplayClass1'::Assignment

请注意,由于字段初始化完成,对局部变量的访问被替换为对字段的访问


再一次为我的英语感到抱歉

Jonathan de Halleux为Reflector编写了一个Reflection.Emit language插件(),它使这类事情变得更加简单。它不是很完美,但是它通常会让你达到95%的效果,这比从纯IL开始要好得多。。。