详解C#中如何访问私有成员

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

 
  1. privatestringname;
  2. publicstringName
  3. {
  4. get
  5. {
  6. returnname;
  7. }
  8. set
  9. {
  10. name=value;
  11. }
  12. }

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

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

1、得到私有字段的值:

 
  1. publicstaticTGetPrivateField<T>(thisobjectinstance,stringfieldname)
  2. {
  3. BindingFlagsflag=BindingFlags.Instance|BindingFlags.NonPublic;
  4. Typetype=instance.GetType();
  5. FieldInfofield=type.GetField(fieldname,flag);
  6. return(T)field.GetValue(instance);
  7. }

2、得到私有属性的值:

 
  1. publicstaticTGetPrivateProperty<T>(thisobjectinstance,stringpropertyname)
  2. {
  3. BindingFlagsflag=BindingFlags.Instance|BindingFlags.NonPublic;
  4. Typetype=instance.GetType();
  5. PropertyInfofield=type.GetProperty(propertyname,flag);
  6. return(T)field.GetValue(instance,null);
  7. }

3、设置私有成员的值:

 
  1. publicstaticvoidSetPrivateField(thisobjectinstance,stringfieldname,objectvalue)
  2. {
  3. BindingFlagsflag=BindingFlags.Instance|BindingFlags.NonPublic;
  4. Typetype=instance.GetType();
  5. FieldInfofield=type.GetField(fieldname,flag);
  6. field.SetValue(instance,value);
  7. }

4、设置私有属性的值:

 
  1. publicstaticvoidSetPrivateProperty(thisobjectinstance,stringpropertyname,objectvalue)
  2. {
  3. BindingFlagsflag=BindingFlags.Instance|BindingFlags.NonPublic;
  4. Typetype=instance.GetType();
  5. PropertyInfofield=type.GetProperty(propertyname,flag);
  6. field.SetValue(instance,value,null);
  7. }

5、调用私有方法:

 
  1. publicstaticTCallPrivateMethod<T>(thisobjectinstance,stringname,paramsobject[]param)
  2. {
  3. BindingFlagsflag=BindingFlags.Instance|BindingFlags.NonPublic;
  4. Typetype=instance.GetType();
  5. MethodInfomethod=type.GetMethod(name,flag);
  6. return(T)method.Invoke(instance,param);
  7. }

测试:

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

 
  1. publicclassTestClass
  2. {
  3. publicTestClass()
  4. {
  5. privatefield1=1;
  6. privatefield2=99;
  7. PrivateFieldA="Lo";
  8. PrivateFieldB="ve";
  9. }
  10. privateintprivatefield1;
  11. privateintprivatefield2;
  12. privatestringPrivateFieldA
  13. {
  14. get;
  15. set;
  16. }
  17. privatestringPrivateFieldB
  18. {
  19. get;
  20. set;
  21. }
  22. privateintAdd()
  23. {
  24. returnprivatefield1+privatefield2;
  25. }
  26. privatestringJoin()
  27. {
  28. returnPrivateFieldA+PrivateFieldB;
  29. }
  30. }

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

 
  1. TestClassobj=newTestClass();
  2. System.Console.WriteLine("私有字段");
  3. System.Console.WriteLine(obj.GetPrivateField<int>("privatefield1"));
  4. System.Console.WriteLine(obj.GetPrivateField<int>("privatefield2"));
  5. System.Console.WriteLine("私有属性");
  6. System.Console.WriteLine(obj.GetPrivateProperty<string>("PrivateFieldA"));
  7. System.Console.WriteLine(obj.GetPrivateProperty<string>("PrivateFieldB"));
  8. System.Console.WriteLine("私有方法");
  9. System.Console.WriteLine(obj.CallPrivateMethod<int>("Add",null));
  10. System.Console.WriteLine(obj.CallPrivateMethod<string>("Join",null));
  11. System.Console.WriteLine("修改私有属性");
  12. obj.SetPrivateProperty("PrivateFieldA","hello");
  13. obj.SetPrivateProperty("PrivateFieldB","world");
  14. System.Console.WriteLine(obj.CallPrivateMethod<string>("Join",null));
  15. System.Console.Read();

结果如下:

hhh

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

原文标题:C#中访问私有成员

链接:http://www.cnblogs.com/zhuqil/archive/2010/07/25/Access-Private-Member.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值