C#开发中如何调用另一个类内定义的Private私有方法
调用Program类私有ViewEmployee()方法的可行方案
私有方法的设计初衷是限制类外部直接访问,如果你确实有场景需要在其他类(包括你提到的Employee类)中调用该方法,可以参考以下几种实现方案,这里以C#语言为例(你提到的private修饰符、类定义形式符合C#的语法特征):
方案1:调整Program类的公开接口(最推荐,不破坏封装性)
不用修改原有私有方法的逻辑,只需要在Program类中新增一个公开的对外入口即可:public class Program { private void ViewEmployee() { // 原有方法逻辑保留 } // 新增公开方法间接调用私有方法 public void ShowEmployeeInfo() { ViewEmployee(); } }之后在其他类中直接实例化Program类,调用新增的
ShowEmployeeInfo()方法即可。
如果允许修改原有方法的修饰符,也可以直接把private改为internal(同程序集内可访问)或者public。方案2:通过反射调用(适用于无法修改Program类源码的场景)
反射可以绕过语言的访问权限限制,直接调用私有成员,示例代码如下:using System.Reflection; // 其他类(比如Employee类)中的调用逻辑 var programObj = new Program(); Type programType = typeof(Program); // 查找私有实例方法 MethodInfo viewMethod = programType.GetMethod("ViewEmployee", BindingFlags.Instance | BindingFlags.NonPublic); if (viewMethod != null) { // 无参方法第二个参数传null,有参数的话按顺序传参数数组即可 viewMethod.Invoke(programObj, null); }该方案存在明显缺陷,非必要不建议使用:
- 执行性能远低于直接调用
- 如果后续
ViewEmployee()方法名、参数发生变更,编译阶段不会报错,运行时才会抛出异常 - 部分低权限运行环境会禁用反射的私有成员访问权限
方案3:友元类配置
如果你用的是C++/C#这类支持友元特性的语言,可以在Program所属的程序集配置中声明调用方程序集为友元,将方法修饰符改为internal后,友元程序集内的所有类都可以直接访问该方法,C#的配置示例是在项目的AssemblyInfo.cs文件中添加如下代码:[assembly: InternalsVisibleTo("调用方所在的程序集名称")]
注意:除非万不得已,否则不要选择反射这类破坏类封装性的方案,优先通过调整类的接口设计满足访问需求,更符合面向对象的设计规范,后续维护成本也更低。
内容的提问来源于stack exchange,提问作者vasantharaj E
相关产品推荐
相关产品推荐

