时间:2021-05-20
开发背景
开发工具: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个。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
友元函数和友元类的需要:类具有封装和信息隐藏的特性。只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的。非成员函数可以访问类中的公有成员
类的成员有两种形式公有成员,在任何地方都能访问私有成员,只有在类的内部才能方法,私有成员命名时,前两个字符是下划线。classFoo:def__init__(s
类的对象不能直接访问类声明的私有成员变量,否则破坏了信息隐藏的目的。在C++中,为了防止某些数据成员或成员函数从外部被直接访问,可以将它们声明为private,
1.类中成员的访问修饰符方位修饰符就是确定该成员能够访问(使用)的区域。C#中常用的有如下修饰符:pubic(公有)、private(私有)、internal(
ASP.NET中前台javascript与后台代码调用1如何在JavaScript访问C#函数?2.如何在JavaScript访问C#变量?3.如何在C#中访问