[C#]如何访问及调用类中私有成员及方法
本文为原创文章、源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称、作者及网址,谢谢!
开发工具: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 >= 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个。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
[C#]SQLite执行效率优化结论
原文: [C#]SQLite执行效率优化结论 一、如要使用SQLite,可以从Visual Studio中的“程序包管理器控制台”输入以下命令完成安装: PM> Install-Package System.Data.SQLite.Core SQLite则会安装到项目中,支持32位或64位,如下图所示: 二、新建一个SQLite数据库,名称命名为Test.db,其表名称及列定义如下: 三、新建一个控制台应用的解决方案,并输入以下代码,看看SQLite的执行时间: using System; using System.Collections.Generic; using System.Data; using System.Data.SQLite; using System.Diagnostics; namespace ConsoleApp { class Program { static void Main(string[] args) { SQLiteConnection connection = Run(() => new SQLiteConnection("Data S...
- 下一篇
阿里云身份管理与访问控制之信任管理: 角色扮演, 临时身份和安全令牌
本文介绍了阿里云访问控制中的角色扮演和临时身份特性。这两个特性帮助客户管理好对合作伙伴, 云服务协同应用, 以及客户应用服务的信任与访问授权, 构成了阿里云安全受控的合作生态的技术基础设施的一部分。 信任管理 云平台中的资源, 我们可以授权给信任的员工, 合作伙伴, 平台服务, 我们自己部署的应用等不同的身份来访问. 合作伙伴A来负责代运维一组Linux服务器, 除此以外不能访问其他资源; 合作伙伴B来负责维护RDB服务, 除此以外不能访问其他资源; 授权给阿里云的多媒体处理服务来处理存放在OSS中指定目录中的图片和视频, 但不能访问其他目录里中的资源. 部署在ECS中的运维工具, 能够根据负载变动情况, 自动关闭一些ECS机器, 或自动升级或启动一些ECS机器. 这些应用场景中的信任管理, 都是通过角色扮演和临时身份实现的. 角色扮演 阿里云账号中的资源分权访问, 对于员工可以使用子用户来实现. 对于不适合子用户(含子用户组)授权的情况, 采取基于角色扮演的授权方法更安全便捷. 比如, 合作伙伴帮助做运维时, 会在他们自己的主账号中管理自身的员工子用户, 我们所需要做的是创建一个(或...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Docker安装Oracle12C,快速搭建Oracle学习环境