首页 > 语言 > 关键词  > C#最新资讯  > 正文

C#中访问私有成员

2010-07-26 10:43 · 稿源:海纳百川,zhuqil.cnblogs.com

首先我必须承认访问一个类的私有成员不是什么好做法。大家也都知道私有成员在外部是不能被访问的。而一个类中会存在很多私有成员:如私有字段、私有属性、私有方法。对于私有成员访问,可以套用下面这种非常好的方式去解决。

private string name;
public string Name
{
    get
    {
        return name;
    }
    set
    {
        name = value;
    }
}

但是有时候,源代码是别人的,你就不能修改源代码,只提供给你dll。或者你去维护别人的代码,源代码却有丢失。这样的情况如果你想知道私有成员的值,甚至去想直接调用类里面的私有方法。那怎么办呢?其实在.net中访问私有成员不是很难,这篇文章提供几个简单的方法让你如愿以偿。

为了让代码用起来优雅,使用扩展方法去实现。

1、得到私有字段的值:

public static T GetPrivateField<T>(this object instance, string fieldname)
{
    BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic;
    Type type = instance.GetType();
    FieldInfo field = type.GetField(fieldname, flag);
    return (T)field.GetValue(instance);
}

2、得到私有属性的值:

public static T GetPrivateProperty<T>(this object instance, string propertyname)
{
    BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic;
    Type type = instance.GetType();
    PropertyInfo field = type.GetProperty(propertyname, flag);
    return (T)field.GetValue(instance, null);
}

3、设置私有成员的值:

public static void SetPrivateField(this object instance, string fieldname, object value)
{
BindingFlagsf lag = BindingFlags.Instance | BindingFlags.NonPublic;
Type type = instance.GetType();
FieldInfo field = type.GetField(fieldname, flag);
field.SetValue(instance, value);
}

4、设置私有属性的值:

public static void SetPrivateProperty(this object instance, string propertyname, object value)
{
BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic;
Type type = instance.GetType();
PropertyInfo field = type.GetProperty(propertyname, flag);
field.SetValue(instance, value, null);
}

5、调用私有方法:

public static T CallPrivateMethod<T>(this object instance, string name, params object[] param)
{
BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic;
Type type = instance.GetType();
MethodInfo method = type.GetMethod(name, flag);
return (T)method.Invoke(instance, param);
}

测试:

下面我们使用一个测试类,进行测试。新建一个类库项目,测试的类代码如下:

public class TestClass
{

    public TestClass()
    {
        privatefield1 = 1;
        privatefield2 = 99;
        PrivateFieldA = "Lo";
        PrivateFieldB = "ve";
    }

    private int privatefield1;
    private int privatefield2;
  

    private string PrivateFieldA
    {
        get;
        set;
    }
    private string PrivateFieldB
    {
        get;
        set;
    }


    private int Add()
    {
        return privatefield1 + privatefield2;
    }
    private string Join()
    {
        return PrivateFieldA + PrivateFieldB;
    }
}

将上面类库的dll引入控制台项目中。使用下面代码去使用这个类的私有成员:

TestClass obj = new TestClass();
System.Console.WriteLine("私有字段");
System.Console.WriteLine(obj.GetPrivateField<int>("privatefield1"));
System.Console.WriteLine(obj.GetPrivateField<int>("privatefield2"));

System.Console.WriteLine("私有属性");
System.Console.WriteLine(obj.GetPrivateProperty<string>("PrivateFieldA"));
System.Console.WriteLine(obj.GetPrivateProperty<string>("PrivateFieldB"));

System.Console.WriteLine("私有方法");
System.Console.WriteLine(obj.CallPrivateMethod<int>("Add",null));
System.Console.WriteLine(obj.CallPrivateMethod<string>("Join", null));

System.Console.WriteLine("修改私有属性");
obj.SetPrivateProperty("PrivateFieldA", "hello");
obj.SetPrivateProperty("PrivateFieldB", "world");
System.Console.WriteLine(obj.CallPrivateMethod<string>("Join", null));
System.Console.Read();

结果如下:

总结:实现对类私有成员的访问。

代码:https://files.cnblogs.com/zhuqil/AccessPrivateDemo.rar

作者:朱祁林 出处:https://zhuqil.cnblogs.com

原文地址:https://www.cnblogs.com/zhuqil/archive/2010/07/25/1784903.html

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

举报

  • 相关推荐
  • Checkout.com携手Visa推出发卡业务 (Card Issuing)

    Checkout.com与Visa达成战略合作,在英国及欧洲地区推出全方位发卡业务。通过Visa全球支付网络,商户可即时获取收款资金用于支付供应商款项,显著提升资金使用效率。该合作特别针对旅游业企业,解决其支付流程分散、资金周转慢的痛点。Checkout.com每年处理数千亿交易的技术能力与Visa网络结合,帮助商户消除预存资金需求,优化现金流管理。双方表示这将大幅提升欧洲商户运营效率,释放增长潜力。

  • 绿舟受邀访问瑞典驻华大使馆,聚焦CBAM共探可持续发展

    绿舟作为跨境碳合规领军企业,受邀访问瑞典驻华大使馆,与瑞典驻华大使馆一等秘书Erik Lindner Olsson及项目官员杨华女士就中瑞企业可持续发展问题展开交流。绿舟联合创始人李智圆先生与绿舟CBAM合规经理崔浩洋先生代表公司出席。双方聚焦CBAM政策与ESG建设,探讨如何助力跨境企业高效合规出海。绿舟已服务超70%头部跨境企业,构建了完善的碳合规体系,推出行业首个一站式碳管理SaaS平台。此次交流深化了中瑞企业在绿色低碳领域的合作共识,为跨境企业应对全球环保政策挑战提供专业支持。

  • 蓝耘元生代MaaS × Kimi K2 × Claude CodeUI,开启编程效率革命

    蓝戟元生代MaaS平台推出"Kimi K2×Claude CodeUI"AI编程解决方案,通过国产首个万亿参数MoE架构开源模型Kimi K2驱动Claude Code,实现本地化部署。该方案具有三大优势:1)成本直降90%,免翻墙使用;2)支持128K超长上下文处理,编程能力超越主流模型;3)提供600万token免费额度。平台采用交互式界面设计,支持移动端操作和WebSocket通信,集成文件管理、Git工具和会话追踪功能,�

  • Checkout.com项尧受邀参与 WAIC2025 共话人工智能时代跨境支付新机遇

    2025世界人工智能大会(WAIC)于7月26-28日在上海举办,全球领先支付解决方案提供商Checkout.com受邀参与"无界人工智能:深化中英合作"主题论坛。其大中华区总经理项尧与行业专家探讨AI赋能跨境商业生态的创新实践,重点分享公司在代理电商平台(Agentic Commerce)领域的支付技术创新,包括与Mastercard、Visa合作构建支持AI代理交易的技术框架。作为支付行业领军者,Checkout.com通过智能支付网络帮助电商平台优化交易管理,支持多币种支付,每年为客户解锁数亿美元收入潜力。本届WAIC展览面积首次突破7万平方米,吸引800余家企业参展,涵盖40余款大模型及60余款智能机器人。

  • 魔乐社区Modelers理事会添新成员,携手共筑开源AI新生态

    2025世界人工智能大会(WAIC)在上海开幕,魔乐社区Modelers理事会第二批14家成员单位正式发布,包括宝德计算机、九章云极等企业。这标志着该社区在构建开放协同的AI生态方面迈出重要一步。新成员涵盖芯片、算力、模型等全链路环节,推动开源生态从"技术聚合"向"价值共创"转型。社区通过开源协作模式,促进Qwen、DeepSeek等开源模型与多语种语料融合,实现技术�

  • 男子被鱼刺扎伤手指住进ICU:多器官功能衰竭

    深圳市民张先生近日在家处理叉尾鮰鱼时,因手指被鱼刺扎伤引发致命感染,最终转入ICU抢救。 经医疗团队诊断,其伤口感染了高致死性的创伤弧菌(又称海洋弧菌),迅速进展为脓毒血症及多器官功能衰竭,生命一度垂危。 创伤弧菌作为革兰氏阴性菌,广泛分布于海洋环境及海产品中。它不仅漂浮于海水,更密集附着于牡蛎、螃蟹、海鱼等表面,甚至可存在于入海口区域�

  • 旷世之声QCC Dongle Pro发布|让苹果设备无线畅听LDAC无损音质

    QCC Dongle Pro和QCC Dongle是全球首款获得苹果MFi认证的无损蓝牙发射器,突破性地实现了苹果设备无线无损音质传输。产品基于高通Snapdragon Sound™技术和索尼LDAC高清音频编解码协议,支持aptX、aptX HD、aptX Adaptive、aptX Lossless等多种编码格式。QCC Dongle Pro还独家支持LDAC编码,传输速率高达990kbps。该产品已通过日本VGP大奖认证,7月18日在京东首发售价599元,为苹果生态用户带来更丰富的高品质无线音频体验。

  • 战地6测试资格免费领 超简单百分百一键领取测试资格教程 限量免费领

    《战地6》测试资格今日开放领取。玩家需通过抖音平台搜索游戏官号,在相关图文下获取资格链接,完成领取后通过EA平台激活游戏参与测试。为避免网络问题影响游戏体验,建议使用加速器优化本地网络环境。本文详细介绍了资格领取步骤,帮助玩家顺利参与本次测试。

  • Cactus Custody 与 Bybit 达成战略合作,提升加密安全系数

    7月23日,Matrixport旗下合规数字资产托管商Cactus Custody宣布与Bybit达成战略合作,其场外结算系统Cactus Oasis将于7月28日正式接入Bybit平台。该系统专为机构客户设计,融合资产安全托管与高效结算功能,用户无需预充值交易所账户,只需将抵押资产存入托管账户即可交易。合作将提升加密投资者的交易体验,降低交易对手风险。Cactus Custody持有香港信托公司牌照,采用冷热钱包分层架构和银行级存储设施,并通过SOC1/2审计认证,确保资产安全合规。双方表示此次合作将加速机构资金入场,推动加密行业机构化进程。

  • 14岁女生解约MCN被索赔家长发声 律师称MCN已涉嫌违法

    ​据小云母亲李丽反映,小云在初二时因“读不进去”执意离家去济南,并于 2023 年 9 月与一家MCN公司签下为期五年的合作协议。合同中详细规定了小云作为主播的工作要求,包括每月直播天数、时长、刷量标准及高额的违约赔偿条款,同时几乎规避了公司的所有法律责任。