访问一个类的私有成员不是什么好做法,大家也都知道私有成员在外部是不能被访问的,这篇文章主要给大家介绍了关于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数组。
六、源代码如下:
http://xiazai.mobange.com/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个。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对编程学习网的支持。
本文标题为:C#访问及调用类中私有成员与方法示例代码
基础教程推荐
- unity实现动态排行榜 2023-04-27
- C# windows语音识别与朗读实例 2023-04-27
- linux – 如何在Debian Jessie中安装dotnet core sdk 2023-09-26
- 一个读写csv文件的C#类 2022-11-06
- C#类和结构详解 2023-05-30
- C#控制台实现飞行棋小游戏 2023-04-22
- C# List实现行转列的通用方案 2022-11-02
- ZooKeeper的安装及部署教程 2023-01-22
- winform把Office转成PDF文件 2023-06-14
- C# 调用WebService的方法 2023-03-09