Net 如何获取私有属性

2023-05-24 18:28:03 来源:博客园

.Net的私有属性、成员变量、方法,都可以通过反射获取调用,当然正常我们不会这么操作


(资料图片)

此章只是做一个反射科普,像EFCore从数据库取值的底层框架就是通过反射直接操作私有的成员变量,而不是方法。

直接上例子,先定义一个类

public class TenantModel    {        public int Id { get; init; }//属性,未定义成员变量会自动生成        public string Name { get; set; }//属性        private string password;//成员变量        public string Password//属性        {            private get //方法(属性里的get;set;均为方法,或者自己定义一个方法测试)            {                return password;            }            set            {                if (value.Length < 6)                    throw new Exception("密码需要大于6位");                password = value;            }        }    }

然后利用反射,获取到私有的password信息

1)通过对象进行反射

var te = new TenantModel()            {                Id = 1,                Name = "kxy",                Password = "1234567"            };            Type type = te.GetType();            //te.GetType().GetMethods(BindingFlags.NonPublic | BindingFlags.Instance);//获取所有私有方法            MethodInfo func1 = type.GetMethod("get_Password", BindingFlags.NonPublic | BindingFlags.Instance);//获取私有方法            var str = func1.Invoke(te, null).ToString();//执行方法            FieldInfo field = type.GetField("password", BindingFlags.NonPublic | BindingFlags.Instance);//获取私有成员变量            string pwd = field.GetValue(te)?.ToString();//取值            field.SetValue(te, "123");//赋值,直接操作成员变量,可以跳过验证

这样就简单实现了一个反射读取私有信息的案例,当然还可以通过程序集反射

2)通过程序集进行反射(因为实例化)

反射也是通过构造函数实例化的,默认为无参,也可以带参,为了展示,我们多定义一个带参构造函数

public TenantModel(int id,string name,string password)        {            Id = id;            Name = name;            Password = password;        }

然后,反射代码如下:

Assembly assembly = Assembly.Load("ServerSignalR");//反射入口,从程序集加载,ServerSignalR为程序集名称            Type type = assembly.GetType("ServerSignalR.Models.TenantModel");//基于类的完整名称找出类型            TenantModel te = Activator.CreateInstance(type, new object[] { 1, "kxy", "1234567" }) as TenantModel;//实例化            MethodInfo func1 = type.GetMethod("get_Password", BindingFlags.NonPublic | BindingFlags.Instance);//获取私有方法            var str = func1.Invoke(te, null)?.ToString();//执行方法            FieldInfo field = type.GetField("password", BindingFlags.NonPublic | BindingFlags.Instance);//获取私有成员变量            string pwd = field.GetValue(te)?.ToString();//取值            field.SetValue(te, "123");//赋值,直接操作成员变量,可以跳过验证

也可以选定dll文件

Assembly assembly = null;            //注意区分开发和生产环境            if (_env.IsDevelopment())            {                assembly = Assembly.LoadFrom("bin//Debug//net5.0//ServerSignalR.dll");//dll的路径            }            else            {                assembly = Assembly.LoadFrom("ServerSignalR.dll");//dll的路径            }            Type type = assembly.GetType("ServerSignalR.Models.TenantModel");//基于类的完整名称找出类型            TenantModel te = Activator.CreateInstance(type, new object[] { 1, "kxy", "1234567" }) as TenantModel;//实例化            MethodInfo func1 = type.GetMethod("get_Password", BindingFlags.NonPublic | BindingFlags.Instance);//获取私有方法            var str = func1.Invoke(te, null)?.ToString();//执行方法            FieldInfo field = type.GetField("password", BindingFlags.NonPublic | BindingFlags.Instance);//获取私有成员变量            string pwd = field.GetValue(te)?.ToString();//取值            field.SetValue(te, "123");//赋值,直接操作成员变量,可以跳过验证

至此,完毕!!!

感谢关注

标签

Net 如何获取私有属性

Net的私有属性、成员变量、方法,都可以通过反射获取调用,当然正常我们不会这么操作此章只是做一个反射科

2023-05-24 18:28:03

讯息:开心小菜园种出“向往的生活”

“老薛,你的葱长得怎么样呀?”“长得可好了,再过1个月就能拔了,我看你的西红柿长得也不错呀!”老张...

2023-05-24 17:52:05

5月24日黄山市场固体环氧树脂清淡

5月24日,黄山固体环氧树脂市场偏弱,整体商谈低迷,主流报盘区间在13600-13800元 吨,相比上一交易日下跌1

2023-05-24 16:50:51

天天新资讯:珠海免税旗下拱北免税店完成升级改造

证券时报e公司讯,5月24日,珠海免税宣布旗下最核心的免税店拱北口岸进境免税店完成升级改造,改造后经营面

2023-05-24 17:02:02

中国海警舰艇编队5月24日在我钓鱼岛领海内巡航

每经AI快讯,5月24日,中国海警1302舰艇编队在我钓鱼岛领海内巡航。这是中国海警依法开展的维权巡航活动。

2023-05-24 15:31:01

世界今热点:优步(UBER.US)与谷歌(GOOGL.US)旗下Waymo达成合作 提供无人驾驶服务

优步表示,今年晚些时候将通过与谷歌旗下自动驾驶公司Waymo的合作,在其网约车和送货平台上提供无人驾驶汽

2023-05-24 15:15:04

世界时讯:华勤技术过会:今年IPO过关第117家 中金公司过4单

华勤技术过会:今年IPO过关第117家中金公司过4单

2023-05-24 14:12:07

骑士卡加油怎么用支付宝付款_骑士卡加油怎么用|每日信息

1、一、根据以下的具体情况来进行打折加油:骑士卡加油优惠是依托骑士卡官方APP来实现的,但用户必须实现申

2023-05-24 13:18:47

全球时讯:侮辱性极强!武汉三镇:队内处罚阿齐兹1美金 期望中国足坛平平安安

5月23日消息,23日,中国足协开出了系列罚单,其中对武汉三镇外援阿齐兹追加停赛4场、罚款4万元。但是当时

2023-05-24 12:44:31

【报资讯】618大促火爆开启 京东20周年3C礼盒低至五折

京东20周年纪念款3C数码礼盒低至5折618还享30天价保

2023-05-24 11:53:29
x 广告
x 广告

Copyright  2015-2022 北方粮油网版权所有  备案号:京ICP备2021034106号-50   联系邮箱: 55 16 53 8@qq.com