C#访问及调用类中私有成员与方法示例代码
作者:cnc 时间:2022-06-02 05:30:35
开发背景
开发工具: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数组。
六、源代码如下:
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个。
来源:https://www.cnblogs.com/cncc/p/8249768.html
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
浅谈Maven的build生命周期和常用plugin
![](https://img.aspxhome.com/file/2023/1/75441_0s.jpg)
C#利用FileSystemWatcher实时监控文件的增加,修改,重命名和删除
![](https://img.aspxhome.com/file/2023/7/68097_0s.png)
mybatis 查询返回Map<String,Object>类型
![](https://img.aspxhome.com/file/2023/0/58760_0s.png)
使用ehcache三步搞定springboot缓存的方法示例
Java Spring框架简介与Spring IOC详解
![](https://img.aspxhome.com/file/2023/6/96056_0s.png)
解决IDEA克隆代码后在右下角没有git分支的问题
![](https://img.aspxhome.com/file/2023/2/63112_0s.jpg)
Jenkins安装以及邮件配置详解
![](https://img.aspxhome.com/file/2023/1/63701_0s.png)
Java将对象保存到文件中/从文件中读取对象的方法
jdbc中class.forname的作用
Java深入浅出理解快速排序以及优化方式
![](https://img.aspxhome.com/file/2023/9/69319_0s.jpg)
SpringBoot实现Mysql使用MD5进行密码加密的示例
![](https://img.aspxhome.com/file/2023/6/62156_0s.png)
Java设计模式之工厂模式分析【简单工厂、工厂方法、抽象工厂】
解析Java和Eclipse中加载本地库(.dll文件)的详细说明
关于maven:pom文件的使用解析
SpringBoot和Vue.js实现的前后端分离的用户权限管理系统
在Spring中自动装配Bean的属性
C#利用反射来判断对象是否包含某个属性的实现方法
Unity命令行打包WebGL的示例代码
java 二分法算法的实例
springboot项目main函数启动的操作
![](https://img.aspxhome.com/file/2023/2/92702_0s.jpg)