.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 如何获取私有属性的更多相关文章

  1. 2019-4-16-C#-使用反射获取私有属性的方法

    title author date CreateTime categories C# 使用反射获取私有属性的方法 lindexi 2019-4-16 10:13:3 +0800 2018-09-26 ...

  2. C# 使用反射获取私有属性的方法

    本文告诉大家多个不同的方法使用反射获得私有属性,最后通过测试性能发现所有的方法的性能都差不多 在开始之前先添加一个测试的类 public class Foo { private string F { ...

  3. Java使用PropertyDescriptor获取实体类中私有属性的值,并给私有属性赋值

    大家都知道Java类中的私有的(private)属性是获取不到的(即使使用继承依然获取不到),那如果非要获取私有属性的值怎么办呢?一般的做法是将该java类封装称为一个JavaBean,即封装该私有属 ...

  4. 【python】-- 类的实例化过程、特征、共有属性和私有属性

    实例化过程 1.类的定义和语法 class dog(object): #用class定义类 "dog class" #对类的说明 def __init__(self,name): ...

  5. Python笔记(十八)_私有属性、实例属性、类属性

    私有属性 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,就变成了一个私有属性,只有内部可以访问,外部不能直接访问或修改. 这样就确保了外部代码不能随意修改对象内部的状态,这样通过 ...

  6. PHP中的__get()和__set()方法获取设置私有属性

    在类的封装中,获取属性可以自定义getXXX()和setXXX()方法,当一个类中有多个属性时,使用这种方式就会很麻烦.为此PHP5中预定义了__get()和__set()方法,其中__get()方法 ...

  7. Java设置以及获取JavaBean私有属性进阶

    在上一篇博客中讲到使用Java提供的原生API设置以及获取一个JavaBean的私有属性. 但是使用Java的原生API过于复杂,有没有更加简单的方法呢?答案是肯定的.下面介绍一个开元工具包来非常方便 ...

  8. Python全栈--9.1--面向对象进阶-super 类对象成员--类属性- 私有属性 查找源码类对象步骤 类特殊成员 isinstance issubclass 异常处理

    上一篇文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象 ...

  9. 一个关于el中获取对象属性的错误

    具体过程描述为: 在JSP页面中通过<%%>定义一个非public类.并定义两个属性相应的get和set方法.在该代码段中实例化该对象,并将该对象放入Request域中. 然后在页面中使用 ...

  10. Java通过反射机制修改类中的私有属性的值

    首先创建一个类包含一个私有属性: class PrivateField{ private String username = "Jason"; } 通过反射机制修改username ...

随机推荐

  1. 微软NewBing真是Niubility

    这是本人2012年的拙作:           晨兮,闻风雨,后而雷鸣电闪.迟不可再三,若故无食.然何如耶?雨大风狂,单车奈何?公交卡空,恐时不予我也.不免叹也,天亦不予我!         而后出, ...

  2. CURL 常用命令

    参考博客:https://blog.csdn.net/wangpengfei163/article/details/80900391

  3. 基于 Web SDK 实现视频通话场景 | 声网 SDK 教程

    声网视频 SDK 被广泛应用于多种实时互动场景中,例如视频会议.视频通话.音视频社交.在线教育等.为了让刚刚接触声网 SDK 的开发者,可以更顺畅地实现基础的视频通话功能,我们基于声网 Web SDK ...

  4. Python爬虫采集商品评价信息--京东

    1.数据采集逻辑 在进行数据采集之前,明确哪些数据为所需,制定数据Schema为爬取工作做出要求,并根据数据Schema制定出有针对性的爬取方案和采集逻辑. 2.数据Schema 3.数据爬取 抓取京 ...

  5. GaussDB(DWS)运维:导致SQL执行不下推的改写方案

    摘要:本文就针对因USING子句的书写方式可能导致MERGE INTO语句的执行不下推的场景,对USING子句的SQL语句进行改写一遍,整个SQL语句可以下推. 本文分享自华为云社区<Gauss ...

  6. jwt 学习笔记

    概述 JWT,Java Web Token,通过 JSON 形式作为 Web 应用中的令牌,用于在各方之间安全地将信息作为 JSON 对象传输,在数据传输过程中还可以完成数据加密.签名等相关处理 JW ...

  7. NEFUOJ P903字符串去星问题

    Description 有一个字符串(长度小于100),要统计其中有多少个,并输出该字符串去掉后的新字符串. Input 输入数据有多组,每组1个连续的字符串; Output 在1行内输出该串内有多少 ...

  8. 方差分析1—单因素方差分析(R语言)

    方差分析是由英国著名统计学家:R.A.Fisher推导,也叫F检验,用于多个样本间均数的比较(分析类别变量.有序变量).当包含的因子是解释变量时,关注的重点通常会从预测转向组别差异的分析.方差分析是一 ...

  9. [Java/LeetCode]算法练习:二进制间距(868/simple)

    1 题目描述 题目来源: https://leetcode-cn.com/problems/binary-gap/ 给定一个正整数 n,找到并返回 n 的二进制表示中两个 相邻 1 之间的 最长距离 ...

  10. [Java EE]SpringBoot/Tomcat之启动时报"Error: Could not find or load main class CLASS xxxx"、"no main manifest attribute"异常

    环境信息如下: OS: CENTOS 7 Tomcat : 9.0.46 SpringBoot: 2.3.12.RELASE Build JDK: 1.8.0_261 Runetime JDK : o ...