通过来自同一对象实例(或基础)的反射调用私有/受保护的方法

2024-01-05

是否可以通过反射调用受保护的方法。我正在使用这个:

 Me.GetType.InvokeMember(Stages(CurrentStage), 
                         Reflection.BindingFlags.InvokeMethod, 
                         Nothing, 
                         Me, 
                         Nothing)

它总是调用没有参数或返回值的方法。这个想法是,我的对象(业务逻辑的事务处理)的用户继承基类,添加要触发的私有方法的负载。然后,他们按照希望触发的顺序将这些方法名称添加到列表中,上面的代码将负责触发它们。

它适用于公共方法,但不适用于同一类中的私有或受保护方法(受保护,因为我有一些“标准”预构建方法要添加到基类中)。实际上,我可以公开这些方法并完成它,但我内心的书呆子不允许我这样做......

我假设这是一项安全功能。有没有办法解决这个问题,或者有人对如何继续但保持我的美味可见性修改器完好无损有任何建议吗?

(注意:它在 VB.NET 中,但如果您愿意的话,C# 答案也可以)。


如果您在实例化对象上调用方法,则还需要 BindingFlags.Instance。因此代码如下所示(注意:我还添加了 BindingFlags 选项以在搜索中包含公共成员):

Me.GetType.InvokeMember(Stages(CurrentStage), 
                        BindingFlags.InvokeMethod Or BindingFlags.NonPublic Or BindingFlags.Public Or BindingFlags.Instance, 
                        Nothing, 
                        Me, 
                        Nothing)

有关如何使用它的更多信息,请参阅MSDN 文档 http://msdn.microsoft.com/en-us/library/66btctbe.aspx.

EDIT

为了支持这个答案,我编写了一个测试程序来演示调用public, protected and private类方法。我已将所有课程上传到 PasteBin。 C# 控制台应用程序由三个类组成,因此可以添加到 Visual Studio 解决方案中并运行以进行测试。

  • 程序.cs http://pastebin.com/wifANryF- 设置要调用的方法(包含在SomeClass班级)。执行调用并打印结果。
  • SomeClass.cs http://pastebin.com/RCdHx4ib- 包含每个可见性修饰符的三个方法:public, protected and private。还注册其自身以及三个包含的方法以供调用Invoker class.
  • 调用者.cs http://pastebin.com/uxj07xkd- 接受要调用的类型和方法的注册。然后枚举已注册的类型并调用方法,构建可枚举的结果集合。

请随意查看该代码,看看您是否可以发现处理方式上的任何差异。不过,我知道这可能不是最简单的方法。如果您对此还有任何疑问,请告诉我。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过来自同一对象实例(或基础)的反射调用私有/受保护的方法 的相关文章

随机推荐