如何使用反射调用私有方法?

时间:2020-03-06 14:44:36  来源:igfitidea点击:

我的课程中有一组私有方法,我需要根据输入值动态调用一个方法。调用代码和目标方法都在同一实例中。代码如下:

MethodInfo dynMethod = this.GetType().GetMethod("Draw_" + itemType);
dynMethod.Invoke(this, new object[] { methodParams });

在这种情况下,GetMethod()将不会返回私有方法。我需要向GetMethod()提供什么" BindingFlags",以便它可以定位私有方法?

解决方案

BindingFlags.NonPublic

我认为我们可以将其传递为" BindingFlags.NonPublic",其中它是" GetMethod"方法。

我们是否绝对确定无法通过继承完成此操作?反思是解决问题时我们应该考虑的最后一件事,它使重构,理解代码以及任何自动化分析变得更加困难。

看起来我们应该只具有一个DrawItem1,DrawItem2等类,这些类将覆盖dynMethod。

只需将代码更改为使用接受BindingFlags的GetMethod的重载版本:

MethodInfo dynMethod = this.GetType().GetMethod("Draw_" + itemType, 
    BindingFlags.NonPublic | BindingFlags.Instance);
dynMethod.Invoke(this, new object[] { methodParams });

这是BindingFlags枚举文档。

BindingFlags.NonPublic本身不会返回任何结果。事实证明,将其与" BindingFlags.Instance"结合使用即可达到目的。

MethodInfo dynMethod = this.GetType().GetMethod("Draw_" + itemType, 
    BindingFlags.NonPublic | BindingFlags.Instance);

我们是否可以为每种要绘制的类型使用不同的Draw方法?然后调用重载的Draw方法,传入要绘制的itemType类型的对象。

问题不清楚,itemType是否真正引用了不同类型的对象。