C#反射,改变方法的主体

时间:2010-09-05 08:04:15

标签: c# code-generation

是否可以在运行时更改方法体?

class Person
{
    public void DoSth()
    { Console.WriteLine("Hello!"); }
}

我希望有一个简单的输入字段(如文本框),我可以在运行时编写方法体源代码。

文本框可能包含以下数据:

for (int i = 0; i < 5; i++)
     Console.WriteLine(i);

时应该超过

new Person().DoSth()

被召唤。

在C#(使用反射)中是否可以(或如何)? 感谢您的帮助。

编辑:
如果上述情况不可能,是否可以在运行时创建一个新方法并调用它?

3 个答案:

答案 0 :(得分:5)

Reflection.Emit是在运行时生成IL的一种方法... http://msdn.microsoft.com/en-us/library/8ffc3x75(v=VS.90).aspx

轻量级代码生成是另一个...... http://blogs.msdn.com/b/joelpob/archive/2004/03/31/105282.aspx

然而,既没有拿C#也没有编译它。为此,您很可能需要调用C#编译器。

您的用例是什么(为什么要这样做)?在您的应用领域中运行代码存在安全注意事项,因此您需要弄清楚如何处理此问题。

答案 1 :(得分:2)

您无法在运行时更改方法体。没有什么可以让你这样做。你能做的最好就是发出一种新的方法。

答案 2 :(得分:1)

这不是反思。

查看面向方面的编程,可以帮助您获得类似的结果:

http://csharp-source.net/open-source/aspect-oriented-frameworks