`
devgis
  • 浏览: 133773 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

详解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

分享到:
评论

相关推荐

    C#反射详解

    -载入 -遍历属性 -调用方法 -破坏单例(调用私有方法) -调用属性 -调用泛型方法 -https://blog.csdn.net/qq_29756987/article/details/95949288

    详解C#中的属性和属性的使用

    属性是一种成员,它提供灵活的机制来读取、写入或计算私有字段的值。属性可用作公共数据成员,但它们实际上是称为“访问器”的特殊方法。这使得可以轻松访问数据,还有助于提高方法的安全性和灵活性。 在此示例中,...

    C#中的只读结构体(readonly struct)详解

    任一结构体都可以有公共属性、私有属性访问器等等。我们从以下结构体示例来开始讨论: public struct Person { public string Name { get; set; } public string Surname { get; set; } public int Age { get; ...

    C# RSA分段加解密实现方法详解

    本文实例讲述了C# RSA分段加解密实现方法。分享给大家供大家参考,具体如下: RSA加解密: 1024位的证书,加密时最大支持117个字节,解密时为128; 2048位的证书,加密时最大支持245个字节,解密时为256。 加密时支持...

    深入C#中get与set的详解

    释一:属性的访问器包含与获取(读取或计算)...以下是返回私有字段 name 的值的 get 访问器: 代码如下:private string name; // the name fieldpublic string Name // the Name property{ get { return name; }}

    C#类继承中构造函数的执行序列示例详解

    但对于基类的私有成员,派生类虽然继承了,但是不能在派生类中访问。 2、所有的类都是按照继承链从顶层基类开始向下顺序构造。最顶层的基类是System.Object类,所有的类都隐式派生于它。只要记住这条规则,就能理解...

    C#类中的属性使用总结(详解类的属性)

    属性是一种类的成员,它的实现类似函数,访问类似字段。它的作用是提供一种灵活和安全的机制来访问,修改私有字段。所以属性必须依赖于字段

    C#单例模式(Singleton Pattern)详解

    会对很多小细节详解。) 单例模式的定义: 确保一个类只有一个实例,并提供一个全局访问点。 首先实例大家应该都明白就是类生成对象的过程简单的就是String s=new String(),则s就是个实例。 Q:如何只生成一个实例? ...

    C#子类对基类方法的继承、重写与隐藏详解

    毕竟,作为一门支持OOP的语言,掌握子类、基类是学习C#的基础。不过,这些概念虽然简单,但是也有一些初学者可能会遇到的坑,我们一起看看吧。 子类继承基类非私有方法 首先我们看最简单的一种,子类继承自基类,但...

    asp.net知识库

    C#静态成员和方法的学习小结 C#中结构与类的区别 C#中 const 和 readonly 的区别 利用自定义属性,定义枚举值的详细文本 Web标准和ASP.NET - 第一部分 XHTML介绍 在ASP.NET页面中推荐使用覆写(Override)而不是事件...

Global site tag (gtag.js) - Google Analytics