通过反射在基类中查找私有方法

5
如何通过名称查找我的方法“button_Click”?如果我将其设置为公共,它可以工作,但我更愿意将其设置为私有。
class Test : BaseTest
{
    public Test()
    {
        LoadMethod();
    }
}

class BaseTest
{
    public void LoadMethod()
    {
        //WHY IS THIS NULL???
        var eventMethod = GetType().GetMethod("button_Click", BindingFlags.NonPublic | BindingFlags.Instance);
    }

    void button_Click(object sender, EventArgs e) { }
}

2
XY 问题 - Sayse
1
@Sayse:虽然可能有其他问题需要解决,但按照所述的方式,这个问题是相当自包含且可回答的。 - Jon Skeet
我已经发布了我的尝试,我认为它应该可以在某种程度上工作。我也说明了我的问题。如果有其他解决方案,我非常乐意听取。 - Julien
1
@JonSkeet - 说得对,但这不就是整个xy问题的关键吗?这只是解决了一个问题,同时掩盖了潜在的问题。 - Sayse
3
一般来说,这种情况下会暗示完全不同的问题——你可以说,在这种情况下,SO 上几乎所有的问题都是 XY 问题,除非 OP 提供完整的大局观、商业理由等等。我认为这个问题没有什么问题。 - Jon Skeet
1个回答

6
为什么GetMethod 返回 null?
因为运行时类型不是 BaseTest 类型,而是 Test 类型,Test 没有定义名为 button_Click 的方法(因为它在基类中是 private)。
如果您将GetType() 调用拆分并运行调试器,则会看到返回的类型为 Test
如果调用 GetType().BaseType,则可以实际查看 BaseTest
var baseType = GetType().BaseType;
if (baseType != null)
{
    var eventMethod = baseType.GetMethod("button_Click", BindingFlags.NonPublic | 
                                                         BindingFlags.Instance);
}

2
BindingFlags.NonPublic 表示搜索将包括非公共成员。Test 类有一个名为 button_Click 的非公共成员。 - Julien
1
不,它不是。BaseTest 是。 - Yuval Itzchakov
你也可以将该方法更改为protected而不是private,这样反射调用就会找到在父类上定义的方法。 - Elliott Beach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接