0

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

有谁能够帮我?

4

2 回答 2

7

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

于 2009-10-01T09:40:46.550 回答
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

请注意,由于文件初始化在任何地方完成,对局部变量的访问被替换为对字段的访问

再次对不起我的英语

于 2009-10-01T11:15:42.757 回答