快上网专注成都网站设计 成都网站制作 成都网站建设
成都网站建设公司服务热线:028-86922220

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

C#访问及调用类中私有成员与方法示例代码

开发背景

公司主营业务:网站设计、成都网站制作、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联公司是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联公司推出滦南免费做网站回馈大家。

开发工具:VS2017

语言:C#

DotNet版本:.Net FrameWork 4.0及以上

系统:Win10 X64

一、首先建立一个控制台APP,并命名为ConsoleApp,如下图所示:

C#访问及调用类中私有成员与方法示例代码

二、新建一个Person类

并在类里面添加两个成员,一个是name字段,另外一个是Display方法,该方法带有一个“前缀”输入参数prefix,用于加在name字段前面,如下代码所示:

class Person
 {
  string name;
  void Display(string prefix)
  {
   Console.WriteLine($"{prefix},{name}");
  }
 }

三、将System.Reflection引用进来,这里是本随笔的关键所在

如下图所示:

using System.Reflection;

四、如何设置及访问name字段?

在这里我们使用反射技术,使用Type类里的反射机制进行访问,

1)公用部分,具体代码如下:

 Person person = new Person();
 Type type = typeof(Person);
 BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Instance;
 FieldInfo fInfo = type.GetField("name", flags);

2)设置name字段,设置方法如下代码所示:

 fInfo.SetValue(person,"CNXY");

3)访问name字段,访问方法如下代码所示:

var name = fInfo.GetValue(person);

4)name字段结果如下:

C#访问及调用类中私有成员与方法示例代码

说明:

BindingFlags.NonPublic:搜索非公有方法的成员;

BindingFlags.Instance:搜索成员实例,包括字段及方法等。

五、如何访问Display私有方法?

同样,借用第四部分代码(person及flags),具体代码如下:

MethodInfo mInfo = type.GetMethod("Display",flags);
mInfo.Invoke(person, new object[] { "Hello" });

输出结果如下:

C#访问及调用类中私有成员与方法示例代码

说明:

Invoke用于调用方法,后面的参数使用数组的方法,如有一个参数,则输入一个参数的object数组,如有多个参数,则输入多个参数的object数组。

六、源代码如下:

http://xiazai.jb51.net/201806/yuanma/ConsoleApp_jb51.rar

七、实际用处

System.Windows.Forms下面有一个类,名叫NotifyIcon,其设置的Text只能是63个字符,所想输入大于63个字符,如下设置方法是行不通的,代码如下:

NotifyIcon ni = new NotifyIcon();
ni.Text = "64个字符(实际有64个字符,这里并没有达到个数,仅作展示)";

那么,我们必须另外的方法来绕过NotifyIcon的限制,这里使用了反射技术(也就是以上所说的),代码如下:

NotifyIcon ni = new NotifyIcon();
string text = "大于63个字符,小于127个字符的字符串";
if (text.Length >= 128) throw new ArgumentOutOfRangeException("Text limited to 127 characters");
Type t = typeof(NotifyIcon);
BindingFlags hidden = BindingFlags.NonPublic | BindingFlags.Instance;
t.GetField("text", hidden).SetValue(ni, text);
if ((bool)t.GetField("added", hidden).GetValue(ni)) t.GetMethod("UpdateIcon", hidden).Invoke(ni, new object[] { true });

以上的限制个数为大于63个,小于127个。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对创新互联的支持。


当前名称:C#访问及调用类中私有成员与方法示例代码
URL链接:http://6mz.cn/article/jhpdgc.html

其他资讯