【问题标题】:C# Reflection, changing a method's bodyC#反射,改变方法的主体
【发布时间】:2010-09-05 08:04:15
【问题描述】:

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

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

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

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

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

应该在什么时候执行

new Person().DoSth()

被调用。

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

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

【问题讨论】:

  • 这不是反射,而是代码生成。这也不是一个好主意。

标签: c# code-generation


【解决方案1】:

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# 编译器。

您的用例是什么(为什么要这样做)?在您的应用程序域中运行代码存在安全考虑,因此您需要弄清楚如何处理。

【讨论】:

  • 我想为扫描仪生成器制作一个小型开发环境。生成器生成一个 C# 方法,只要找到标记,就应该执行该方法。转换表可以在运行时实际加载(存储在文件中)。我只是不想在开发扫描仪规范时重新编译孔扫描仪程序。
【解决方案2】:

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

【讨论】:

  • @Steven,dynamic 如何允许修改现有类型?
  • 您可以使用通过dynamic 引用的ExpandoObject,允许您分配一个委托,以便可以使用方法语法调用它。
【解决方案3】:

这不是反射。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多