通过反射找到特定的方法

困惑的人

假设我们在一个类中有两个公共方法:

public class SomeClass
{
    public bool DoSomething(int param1)
    {
        return param1 == 30;
    }

    public bool DoSomethingElse(int param1)
    {
        param1 *= 2;
        return param1 == 30;
    }
}

我可以编写以下代码来使用反射来获得这两种方法:

MethodInfo[] methods = typeof(SomeClass).GetMethods(BindingFlags.Public | BindingFlags.Instance)
                       .Where(x => x.ReturnType == typeof(bool)
                              && x.GetParameters().Length == 1
                              && x.GetParameters()[0].ParameterType == typeof(int)).ToArray();

假设我只想要DoSomethingElse,我可以使用methods[1]

但是,假设他们在下次编译此类时交换了位置。我最终会DoSomething代替。

分离这两种方法的唯一方法是,DoSomethingElse在检查之前将参数乘以2。

我还能用反射做其他检查以确保我总是得到DoSomethingElse吗?

注意:每次编译时,我正在寻找的方法的名称可能都会更改,因此简单地搜索它们的名称也不起作用。

德米特里·拜琴科(Dmitry Bychenko)

从技术上讲,您可以分析方法的IL代码让我们检查一下是否* 2在第一个10IL代码内:

https://zh.wikipedia.org/wiki/List_of_CIL_instructions

码:

  MethodInfo[] methods = GetType()
    .GetMethods(BindingFlags.Public | BindingFlags.Instance)
    .Where(x => x.ReturnType == typeof(bool)
           && x.GetParameters().Length == 1
           && x.GetParameters()[0].ParameterType == typeof(int))
    .Where(m => m
       .GetMethodBody()
       .GetILAsByteArray()
       .Take(10)                  // take first 10 IL codes
       .SkipWhile(b => b != 0x18) // ldc.i4.2 : load 2
       .Any(b => b == 0x5A))      // mul      : multiply 
    .ToArray();

我们来看一下:

  Console.Write(string.Join(Environment.NewLine, methods.Select(m => m.Name)));

结果:

  DoSomethingElse

但是,我强烈建议您使用特定方法Name或带有属性的标记方法等。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

通过反射找到实现通用接口的类型

来自分类Dev

通过Java反射找到Scala类型的伴随对象的可靠方法是什么?

来自分类Dev

通过反射获取阴影方法

来自分类Dev

通过反射检查方法内部是否使用了特定的扩展方法

来自分类Dev

通过反射访问/执行泛型方法?

来自分类Dev

无法通过Java反射调用方法:NoSuchMethodException

来自分类Dev

mockito:通过反射模拟参数的方法调用

来自分类Dev

通过反射列出Scala嵌套对象方法

来自分类Dev

通过反射调用方法时的歧义匹配

来自分类Dev

如何通过反射从方法中获取注释

来自分类Dev

通过反射检索的变量类型的方法调用

来自分类Dev

通过反射调用嵌套的DeepObject方法

来自分类Dev

通过反射检索方法时,出现NoSuchMethodException

来自分类Dev

通过反射和返回类型查找方法

来自分类Dev

通过反射调用本地泛型方法

来自分类Dev

通过反射通过表达式调用方法

来自分类Dev

通过反射通过表达式调用泛型方法

来自分类Dev

Java:通过功能界面中的反射调用方法

来自分类Dev

使用Proguard后通过反射访问方法时出现NoSuchMethodException

来自分类Dev

Java,通过反射进行记录的方法名称

来自分类Dev

如何通过反射将枚举值传递给方法

来自分类Dev

如何通过反射调用带有枚举(枚举)参数的方法?

来自分类Dev

通过反射调用具有命名参数的方法

来自分类Dev

无法通过反射调用带有varargs参数的方法-NoSuchMethodException

来自分类Dev

通过反射调用实例方法,就好像它是静态的

来自分类Dev

通过反射访问main方法中的局部变量

来自分类Dev

如何通过反射找出方法的可见性?

来自分类Dev

通过反射获取的方法的执行时间是否更长?

来自分类Dev

仅使用反射通过类型参数区分通用方法?

Related 相关文章

  1. 1

    通过反射找到实现通用接口的类型

  2. 2

    通过Java反射找到Scala类型的伴随对象的可靠方法是什么?

  3. 3

    通过反射获取阴影方法

  4. 4

    通过反射检查方法内部是否使用了特定的扩展方法

  5. 5

    通过反射访问/执行泛型方法?

  6. 6

    无法通过Java反射调用方法:NoSuchMethodException

  7. 7

    mockito:通过反射模拟参数的方法调用

  8. 8

    通过反射列出Scala嵌套对象方法

  9. 9

    通过反射调用方法时的歧义匹配

  10. 10

    如何通过反射从方法中获取注释

  11. 11

    通过反射检索的变量类型的方法调用

  12. 12

    通过反射调用嵌套的DeepObject方法

  13. 13

    通过反射检索方法时,出现NoSuchMethodException

  14. 14

    通过反射和返回类型查找方法

  15. 15

    通过反射调用本地泛型方法

  16. 16

    通过反射通过表达式调用方法

  17. 17

    通过反射通过表达式调用泛型方法

  18. 18

    Java:通过功能界面中的反射调用方法

  19. 19

    使用Proguard后通过反射访问方法时出现NoSuchMethodException

  20. 20

    Java,通过反射进行记录的方法名称

  21. 21

    如何通过反射将枚举值传递给方法

  22. 22

    如何通过反射调用带有枚举(枚举)参数的方法?

  23. 23

    通过反射调用具有命名参数的方法

  24. 24

    无法通过反射调用带有varargs参数的方法-NoSuchMethodException

  25. 25

    通过反射调用实例方法,就好像它是静态的

  26. 26

    通过反射访问main方法中的局部变量

  27. 27

    如何通过反射找出方法的可见性?

  28. 28

    通过反射获取的方法的执行时间是否更长?

  29. 29

    仅使用反射通过类型参数区分通用方法?

热门标签

归档