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

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

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

在这种情况下, GetMethod()不会返回私有方法。 我需要向GetMethod()提供哪些BindingFlags以便它可以找到私有方法?


只需更改代码以使用接受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);

如果你真的想让自己陷入麻烦,通过编写一个扩展方法使其更容易执行:

static class AccessExtensions
{
    public static object call(this object o, string methodName, params object[] args)
    {
        var mi = o.GetType ().GetMethod (methodName, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance );
        if (mi != null) {
            return mi.Invoke (o, args);
        }
        return null;
    }
}

和用法:

    class Counter
    {
        public int count { get; private set; }
        void incr(int value) { count += value; }
    }

    [Test]
    public void making_questionable_life_choices()
    {
        Counter c = new Counter ();
        c.call ("incr", 2);             // "incr" is private !
        c.call ("incr", 3);
        Assert.AreEqual (5, c.count);
    }
链接地址: http://www.djcxy.com/p/90341.html

上一篇: How do I use reflection to invoke a private method?

下一篇: UINavigationBar fades when pushing/popping