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

系统 2553 0

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

    
  1. private string name;
  2. public string Name
  3. {
  4. get
  5. {
  6. return name;
  7. }
  8. set
  9. {
  10. name=value;
  11. }
  12. }

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

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

1、得到私有字段的值:

    
  1. public static TGetPrivateField<T>( this object instance, string fieldname)
  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. public static TGetPrivateProperty<T>( this object instance, string propertyname)
  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. public static void SetPrivateField( this objectinstance,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. public static void SetPrivateProperty( this objectinstance,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. public static TCallPrivateMethod<T>( this object instance, string name, params object []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. public class TestClass
  2. {
  3. public TestClass()
  4. {
  5. privatefield1=1;
  6. privatefield2=99;
  7. PrivateFieldA= "Lo" ;
  8. PrivateFieldB= "ve" ;
  9. }
  10. private int privatefield1;
  11. private int privatefield2;
  12. private string PrivateFieldA
  13. {
  14. get ;
  15. set ;
  16. }
  17. private string PrivateFieldB
  18. {
  19. get ;
  20. set ;
  21. }
  22. private int Add()
  23. {
  24. return privatefield1+privatefield2;
  25. }
  26. private string Join()
  27. {
  28. return PrivateFieldA+PrivateFieldB;
  29. }
  30. }

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

    
  1. TestClassobj= new TestClass();
  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#中如何访问私有成员


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论