【问题标题】:Extract a method's implementation with reflection使用反射提取方法的实现
【发布时间】:2013-12-10 14:41:53
【问题描述】:

假设我有两个类,ClassAClassB 如下:

class ClassA
{
    public void MyFunctionA(ClassB classB)
    {
        classB.MyActionB = () => this.MySecretFunctionA(3); // "Hard coded 3"
    }

    private void MySecretFunctionA(int anInt)
    {
        Console.WriteLine(anInt.ToString());
    }
}

class ClassB
{
    public Action MyActionB;

    public void MyFunctionB()
    {
        MyActionB();
    }

    private void MySecretFunctionB()
    {
        // Here
    }
}

ClassB 是否有可能在运行时准确地“知道” MyActionB 在被调用时会做什么?例如,ClassB 是否可以在运行时再次提取“3”? (参见“硬编码 3”注释。)

ClassAClassB 位于不同的程序集中,如果有区别(我不这么认为)ClassB 的程序集是在运行时加载的。

在标题中,我建议反思,但如果在这种情况下它不是适当的术语,我会编辑它。如果可能的话,只是一个想法会很好。谢谢。

【问题讨论】:

    标签: c# reflection delegates runtime


    【解决方案1】:

    您可以通过

    访问方法的 IL

    http://msdn.microsoft.com/en-us/library/system.reflection.methodbase.getmethodbody(v=vs.90).aspx

    但是,这是否有任何实际用途取决于您的用例的具体程度。由于此信息未保存在元数据中,因此无法在运行时访问或反向工程语法树。

    当新的 Roslyn 编译器发布时,也许未来会有一些可能。

    【讨论】:

      猜你喜欢
      • 2011-04-08
      • 1970-01-01
      • 2011-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多