使用反射提取方法的实现

时间:2013-12-10 14:41:53

标签: c# reflection delegates runtime

假设我有两个课程,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的程序集在运行时加载。

在标题中,我建议反思,但如果在这种情况下它不是正确的术语,我会编辑它。如果有可能的话,只想知道如何做得好。感谢。

1 个答案:

答案 0 :(得分:1)

您可以通过

访问IL的方法

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

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

展望未来可能会使用新的Roslyn编译器,当它发布时。