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

作者:cnc 时间:2022-06-02 05:30:35 

开发背景

开发工具: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个。

来源:https://www.cnblogs.com/cncc/p/8249768.html

标签:c#,调用,私有成员
0
投稿

猜你喜欢

  • 浅谈Maven的build生命周期和常用plugin

    2022-11-03 01:47:52
  • C#利用FileSystemWatcher实时监控文件的增加,修改,重命名和删除

    2021-08-21 05:46:28
  • mybatis 查询返回Map<String,Object>类型

    2023-11-14 07:06:09
  • 使用ehcache三步搞定springboot缓存的方法示例

    2021-06-25 04:44:12
  • Java Spring框架简介与Spring IOC详解

    2021-08-06 03:05:56
  • 解决IDEA克隆代码后在右下角没有git分支的问题

    2021-11-23 09:43:19
  • Jenkins安装以及邮件配置详解

    2023-04-20 12:42:39
  • Java将对象保存到文件中/从文件中读取对象的方法

    2022-06-18 21:26:42
  • jdbc中class.forname的作用

    2023-04-13 00:56:18
  • Java深入浅出理解快速排序以及优化方式

    2023-01-17 13:50:44
  • SpringBoot实现Mysql使用MD5进行密码加密的示例

    2022-11-24 23:14:16
  • Java设计模式之工厂模式分析【简单工厂、工厂方法、抽象工厂】

    2021-07-07 21:11:57
  • 解析Java和Eclipse中加载本地库(.dll文件)的详细说明

    2023-11-11 01:23:31
  • 关于maven:pom文件的使用解析

    2022-02-08 06:21:41
  • SpringBoot和Vue.js实现的前后端分离的用户权限管理系统

    2023-09-03 14:37:33
  • 在Spring中自动装配Bean的属性

    2022-01-29 07:01:28
  • C#利用反射来判断对象是否包含某个属性的实现方法

    2023-02-26 06:57:52
  • Unity命令行打包WebGL的示例代码

    2023-02-02 10:05:13
  • java 二分法算法的实例

    2023-04-25 05:04:05
  • springboot项目main函数启动的操作

    2023-03-30 16:07:58
  • asp之家 软件编程 m.aspxhome.com