本文为原创文章、源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称、作者及网址,谢谢!


开发工具:VS2017

语言:C#

DotNet版本:.Net FrameWork 4.0及以上

系统:Win10 X64

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

二、新建一个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字段结果如下:

说明:

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

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

五、如何访问Display私有方法?同样,借用第四部分代码(person及flags),具体代码如下:

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

输出结果如下:

说明:

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

六、源代码如下:

七、实际用处,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 >= ) 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个。

最新文章

  1. 为什么我如此热爱这样一个比赛(转自vici)
  2. python 模块基础介绍
  3. Firemonkey Bitmap 设定像素颜色 Pixel
  4. 关闭和启动adb服务命令
  5. Aeroplane chess(HDU 4405)
  6. Fedora上配置一个安全FTP
  7. 深入理解学习Git工作流(转)
  8. Akka 简介与入门
  9. cp 覆盖 \cp a test\a
  10. 前端的UI设计与交互之色彩篇
  11. SHELL脚本--expr命令全解
  12. 关于Navicat连接虚拟机宝塔数据库
  13. NPM常用命令install 淘宝镜像 update等
  14. 对股市骗子内部的一次apt测试
  15. day24 python学习 类 画元,命名空间作用域,组合,人狗大战升级
  16. -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment avariable and mvn script match.
  17. 使用PowerDesigner建立数据库模型【转】
  18. 170428、centos6.5安装Subversion + Apache +Jsvnadmin
  19. Variant
  20. matlab基本指令

热门文章

  1. CentOS7脱机安装SQL Server 2017
  2. Python3 词汇助手 有道翻译助手 有道导出文件格式转换
  3. TCP头部分析与确认号的理解
  4. springMVC(1)---获取前段数据
  5. 载入DLL中的图片资源生成Skia中的SkBitmap对象
  6. freemarker将文件读写到HTML中
  7. Python绘制3d螺旋曲线图实例代码
  8. myeclipse 2014 customize_Perspective 失效解决方法-有效
  9. Myeclipse Reload
  10. 9.python面向对象编程