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

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

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


当前回答

我认为你可以传递它BindingFlags。NonPublic是GetMethod方法。

其他回答

你确定这不能通过继承来实现吗?反射是解决问题时最不应该考虑的事情,它会使重构、理解代码和任何自动化分析变得更加困难。

看起来你应该有一个DrawItem1, DrawItem2等类来覆盖你的dynMethod。

我认为你可以传递它BindingFlags。NonPublic是GetMethod方法。

应该注意,从派生类调用可能会有问题。

容易出错:

this.GetType().GetMethod("PrivateTestMethod", BindingFlags.Instance | BindingFlags.NonPublic)

正确的:

typeof(CurrentClass).GetMethod("PrivateTestMethod", BindingFlags.Instance | BindingFlags.NonPublic)

简单地改变你的代码,使用重载版本的GetMethod接受BindingFlags:

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

下面是BindingFlags枚举文档。

BindingFlags。NonPublic本身不会返回任何结果。事实证明,将其与BindingFlags结合。实例起作用。

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