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


猜你喜欢
- 前言在上网的时候我们常常遇到文件上传的情况,例如上传头像、上传资料等;当然除了上传,遇见下载的情况也很多,接下来看看我们 servlet 中
- 背景SpringBoot 版本<parent> <groupId>org.springfr
- 目前在公司做一个小东西,里面用到了 FFmpeg 简单处理音视频,感觉功能特别强大,在做之前我写了一个小例子,现在记录一下分享给大家,希望大
- Android中很多产品(比如360手机助手、网易菜单...)都采用侧滑菜单的展现形式,采用这种展现形式1、能把更多的展现内容都存放在菜单中
- JUC包(java.util.concurrent)中提供了对定时任务的支持,即ScheduledExecutorService接口。本文对
- Spring-Data-Redis项目(简称SDR)对Redis的Key-Value数据存储操作提供了更高层次的抽象,类似于Spring F
- 在Spring Boot中,Spring Boot会自动搜索映射的Entity,并且创建相应的table,但是有时候我们希望自定义某些内容,
- 第一,这货速度太快,第二,模仿真机环境,第三,秒杀任何Android模拟器包括真机,不多说上图,我忒忙! 官网:http://www.gen
- JPA like 模糊查询 语法格式public List<InstitutionInfo> getAllInstitution
- Java内部类(Inner Class),类似的概念在C++里也有,那就是嵌套类(Nested Class),乍看上去内部类似乎有些多余,它
- 一、jaxb是什么 JAXB是Java Architecture for XML Bindi
- springboot logback动态获取application的配置项在多环境的情况下,logback的日志路径需要进行针对性配置,也就
- 作为工厂方法模式的孪生兄弟,相信大家对工厂方法模式和抽象工厂模式傻傻分不清楚吧。那么,就让我来拯救大家吧!抽象工厂模式定义:所谓抽象工厂模式
- RocketMQ修改生产者消费者日志保存路径rocket默认是将所有日志文件保存到user.home的对于win系统就是C盘了。1.修改Ro
- 本文实例讲述了Java内部类对象的创建及hook机制。分享给大家供大家参考,具体如下:Java中的内部类虽然在状态信息上与其外围类在状态信息
- 小程序获取手机号,后端JAVA解密流程代码微信官方文档获取手机号流程地址,先看下最好方便理解下面步骤实现思路,步骤如下1.前端需先调用官方w
- 今天因为工作需要,把以前编写的一个GPS测试程序拿出来重新修改了一下。这个程序说起来有些历史了,是我11年编写的,那时候学了Android开
- 因为在准备讲Maven用Maven Helper插件的时候,在网上学习,发现资料很少,我就把自己研究的配置分享给大家!!IDEA(本人用的2
- 一、项目简述功能包括(管理员和游客角色):1:用户及主要操作功能 游客可以浏览网站的主页,但是需要注册为会员后部分小 说才能对网络小说进免费
- 本文实例讲述了C#生成随机数功能。分享给大家供大家参考,具体如下:using System;using System.Collections