编译一个方法,就好像它是另一个方法的一部分 class

compiling a method as if it was part of another class

我正在寻找可以编译方法的东西,就好像它在不同的 class 中一样,这样我就可以注入使用内部字段和类型的方法,而无需手动更改操作数值。

例如,如果我们需要获取调试值:

class bla{
internal string importantValue;
...
public void onInitialize(){
    ...
    //this is where the compiler should be made to think it is
}
}

以及进入编译器的代码

public void onInitialize(){ //code to be compiled as if it were in that method
    File.WriteAllText("usefulString.txt",importantValue.toString());
}

然后我们可以得到编译输出的il并将其插入bla.onInitialize这样我们现在就可以得到我们的值

根据给出的示例,使 onInitialize() 受保护,然后在另一个 class 中构造覆盖将起作用。

或者使方法的主体成为在 class 级别定义的委托 - 然后在您的代码中设置不同的委托以使其执行其他操作。

我真的不明白你想要达到什么,我认为有一个更简单的方法。

但是如果我从你的问题标题中了解到,你想要编译你的 class bla (例如)并且你希望在方法 onInitialize 中添加新代码(不会在那里退出)在编译时。是真的吗?

为此你有几种方法。我将描述其中的两个。

  1. 您可以使用像 StaticProxy.Fody 这样的库。这个库可以让你拦截方法并注入你想要的任何东西。因此,在您的示例中,您拦截了 onInitialize 方法并将此代码添加到其中 File.WriteAllText("usefulString.txt",importantValue.toString()); 所有这些都在编译时。编译代码后,您的输出 dll 将包含此注入代码。

  2. 第二个选项是定期编译你的代码,然后你可以使用 Mono.Cecil 读取你编译的 dll 并编写代码,将你想要的任何东西添加到你想要的地方,(在在我们的示例中,将 File.WriteAllText etc. 添加到 onInitialize) 保存此 dll 后它将包含新注入的代码。

这两个选项都是以静态方式(即编译时而非运行时)添加代码的简单方法。