如何在C#中使用反射获取从方法调用的方法列表

比乔伊G

如何获取在C#(DotNet)中使用反射从方法调用的方法的列表,或者如何检查是否使用反射从Method2调用方法1?

TC。

正如其他人指出的那样,使用反射基本上是不可能做到的。您必须自己解析方法的IL字节码才能找到调用。幸运的是,有一个名为Mono Cecil的美丽项目(也可以在nuget找到),它为您完成了所有艰苦的工作。这是一个最小的示例,说明如何使用Mono Cecil解决您的问题:

static class MethodDefinitionExtensions
{
    public static bool CallsMethod(this MethodDefinition caller, 
        MethodDefinition callee)
    {
        return caller.Body.Instructions.Any(x => 
            x.OpCode == OpCodes.Call && x.Operand == callee);
    }
}

class Program
{
    private static AssemblyDefinition _assembly = AssemblyDefinition.ReadAssembly(
        System.Reflection.Assembly.GetExecutingAssembly().Location);

    private static void Method1()
    {
        Method2();
    }

    private static void Method2()
    {
        Method1();
        Method3();
    }

    private static void Method3()
    {
        Method1();
    }

    private static IEnumerable<MethodDefinition> GetMethodsCalled(
        MethodDefinition caller)
    {
        return caller.Body.Instructions
            .Where(x => x.OpCode == OpCodes.Call)
            .Select(x => (MethodDefinition)x.Operand);
    }

    private static MethodDefinition GetMethod(string name)
    {
        TypeDefinition programType = _assembly.MainModule.Types
            .FirstOrDefault(x => x.Name == "Program");
        return programType.Methods.First(x => x.Name == name);
    }

    public static void Main(string[] args)
    {
        MethodDefinition method1 = GetMethod("Method1");
        MethodDefinition method2 = GetMethod("Method2");
        MethodDefinition method3 = GetMethod("Method3");

        Debug.Assert(method1.CallsMethod(method3) == false);
        Debug.Assert(method1.CallsMethod(method2) == true);
        Debug.Assert(method3.CallsMethod(method1) == true);

        Debug.Assert(GetMethodsCalled(method2).SequenceEqual(
            new List<MethodDefinition> { method1, method3 }));
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在C#中使用反射获取方法的所有属性和属性数据

来自分类Dev

如何在不使用C#中使用反射的情况下从该方法内部获取方法名称

来自分类Dev

如何在c#中使用反射获取列表类型元素

来自分类Dev

如何在C#中使用构造函数调用方法?

来自分类Dev

如何在C#中使用Ajax调用类方法

来自分类Dev

如何在SmartFormat反射语法中使用C#扩展方法?

来自分类Dev

如何在asp.net C#中使用Ajax调用C#方法?

来自分类Dev

如何在C#中使用反射获取类型的全限定名称

来自分类Dev

如何在C#中使用反射获取Json属性名称

来自分类Dev

如何在Java类的公共成员中使用反射来调用方法?

来自分类Dev

如何在Groovy中使用反射调用具有空参数值的方法?

来自分类Dev

使用反射从C#Dll调用C#方法

来自分类Dev

如何在C#中使用DLL Import和Get事件调用回调方法C ++

来自分类Dev

如何通过反射C#在setter中调用方法

来自分类Dev

如何通过 C# 中的任务调用反射方法?

来自分类Dev

C#以一般方式调用使用反射的方法

来自分类Dev

C#:使用反射动态调用显式实现的方法

来自分类Dev

使用反射C#的静态类中的调用方法

来自分类Dev

C#:使用反射动态调用显式实现的方法

来自分类Dev

如何使用C#反射调用具有通用List参数的扩展方法?

来自分类Dev

C#反射调用动态方法

来自分类Dev

C#反射不调用方法

来自分类Dev

如何在C#中使用Split()方法获取n部分的String?

来自分类Dev

如何在 C# 中使用 XPathEvaluate 方法通过 Xpath 获取节点元素属性的值?

来自分类Dev

如何在C#反射中解决通用方法的歧义

来自分类Dev

使用反射从Type获取类,并在C#中使用Type调用泛型构造函数

来自分类Dev

C#9-如何使用反射调用默认接口方法?

来自分类Dev

如何在C#中使用反射从类型和设置属性值中按名称获取属性

来自分类Dev

C#在方法中使用通用列表

Related 相关文章

  1. 1

    如何在C#中使用反射获取方法的所有属性和属性数据

  2. 2

    如何在不使用C#中使用反射的情况下从该方法内部获取方法名称

  3. 3

    如何在c#中使用反射获取列表类型元素

  4. 4

    如何在C#中使用构造函数调用方法?

  5. 5

    如何在C#中使用Ajax调用类方法

  6. 6

    如何在SmartFormat反射语法中使用C#扩展方法?

  7. 7

    如何在asp.net C#中使用Ajax调用C#方法?

  8. 8

    如何在C#中使用反射获取类型的全限定名称

  9. 9

    如何在C#中使用反射获取Json属性名称

  10. 10

    如何在Java类的公共成员中使用反射来调用方法?

  11. 11

    如何在Groovy中使用反射调用具有空参数值的方法?

  12. 12

    使用反射从C#Dll调用C#方法

  13. 13

    如何在C#中使用DLL Import和Get事件调用回调方法C ++

  14. 14

    如何通过反射C#在setter中调用方法

  15. 15

    如何通过 C# 中的任务调用反射方法?

  16. 16

    C#以一般方式调用使用反射的方法

  17. 17

    C#:使用反射动态调用显式实现的方法

  18. 18

    使用反射C#的静态类中的调用方法

  19. 19

    C#:使用反射动态调用显式实现的方法

  20. 20

    如何使用C#反射调用具有通用List参数的扩展方法?

  21. 21

    C#反射调用动态方法

  22. 22

    C#反射不调用方法

  23. 23

    如何在C#中使用Split()方法获取n部分的String?

  24. 24

    如何在 C# 中使用 XPathEvaluate 方法通过 Xpath 获取节点元素属性的值?

  25. 25

    如何在C#反射中解决通用方法的歧义

  26. 26

    使用反射从Type获取类,并在C#中使用Type调用泛型构造函数

  27. 27

    C#9-如何使用反射调用默认接口方法?

  28. 28

    如何在C#中使用反射从类型和设置属性值中按名称获取属性

  29. 29

    C#在方法中使用通用列表

热门标签

归档