.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. 在Linux中安装containerd作为kubernetes的容器运行时

    概述 从kubernetes1.24开始的版本移除了内置的docker支持,用户可以自行选择需要使用的容器运行时,比如containerd.CRI-O.Docker Engine等等,这里我们采用二进 ...

  2. 一文了解清楚kafka消息丢失问题和解决方案

    前言 今天分享一下kafka的消息丢失问题,kafka的消息丢失是一个很值得关注的问题,根据消息的重要性,消息丢失的严重性也会进行放大,如何从最大程度上保证消息不丢失,要从生产者,消费者,broker ...

  3. [C++STL教程]6.bitset是什么?和bool有什么区别?零基础都能看懂的入门教程

    之前我们介绍过vector, queue, stack,map,set,今天我们介绍另外一个stl容器:bitset. 作者:Eriktse 简介:19岁,211计算机在读,现役ACM银牌选手力争以通 ...

  4. 如何用浏览器读取本地文件(兼容IE8),new bing能帮我吗?

    浏览器读写文件? 有一份老旧而精巧的代码(2006或更早),带js的html,可以只用浏览器来处理一些二进制存档数据. 文件的读写怎么办?通过变动的方法来完成. 利用十六进制编辑软件如WinHEX,直 ...

  5. Linux 大文件按大小切割,合并还原

                    工作中,由于堡垒机限制,大文件无法上传,故产生切割大文件上传后合并还原的需求. 不说废话,直接上干货: 切割: 1.1G文件,切割为200M大小的几个文件: split ...

  6. Windows 11 Update Download Error Solution - 0x80248007

    I had the same issue on a Windows 2019 virtual server while performing routine windows updates. The ...

  7. Java基础关于栈和堆的内存分配问题(转载)

    AVA在程序运行时,在内存中划分5片空间进行数据的存储.分别是:1:寄存器.2:本地方法区.3:方法区.4:栈.5:堆. 基本,栈stack和堆heap这两个概念很重要,不了解清楚,后面就不用学了. ...

  8. R语言数据加工厂——plyr包使用

    plyr包是Hadley Wickham大神为解决split – apply – combine问题而写的一个包,其动机在与提供超越for循环和内置的apply函数族的一个一揽子解决方案.使用plyr ...

  9. python类详解

    类封装 继承 多态一静态属性1.静态变量和静态方法都属于类的静态成员,它们与普通的成员变量和成员方法不同,静态变量和静态方法只属于定义它们的类,而不属于某一个对象.2.静态变量和静态方法都可以通过类名 ...

  10. [Oracle]创建数据库表【待完善】

    1 前期准备 -- 参考文献 https://www.it1352.com/597381.html -- step1 创建用户<JOHNY>, 来创建对应的(默认)数据库模式(SCHEMA ...