如何使用反射调用私有方法?
时间: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是否真正引用了不同类型的对象。