首页 > 其他分享 >Net 如何获取私有属性

Net 如何获取私有属性

时间:2023-05-24 17:34:04浏览次数:34  
标签:password 私有 TenantModel BindingFlags Net te type 属性

 

  .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");//赋值,直接操作成员变量,可以跳过验证

 

  至此,完毕!!!

  感谢关注

 

标签:password,私有,TenantModel,BindingFlags,Net,te,type,属性
From: https://www.cnblogs.com/wskxy/p/17428888.html

相关文章

  • java 反射:类和属性是否有注解
    booleanisAnnotationPresent(Class<?extendsAnnotation>annotationClass)元素上是否包含指定类型的注解,存在则返回true,否则返回false<AextendsAnnotation>AgetAnnotation(Class<A>annotationClass)获取元素上指定的注解,如果元素没有该注解返回null<AextendsAnn......
  • kubernetes v1.27.2安装并配置calico网络为BGP模式
    1.集群信息机器均为2C4G的虚拟机,硬盘为60G,系统版本均为centos7.9IPHostnameOSblade192.168.63.61master.sec.comcentos7.9master192.168.63.62node01.sec.comcentos7.9worker192.168.63.63node02.sec.comcentos7.9worker2.基础系统配置2.1.主......
  • LinuxMint 安装 .NET 7 发生No SDKs were found.
    一、环境LinuxMint21.1二、安装方式1.通过系统软件管理器,搜索DotNetSDK安装.net7SDK2.dotnet--info查看.net信息,提示.NETSDKsInstalled:NoSDKswerefound.  3.查看安装程序(1)/usr/lib/dotnet检查/usr/lib/dotnet中,是否存在sdk,sdk-manifests,templates目录?(2)/us......
  • selenium 启动ie浏览器报错:Unexpected error launching Internet Explorer. Protected
    解决selenium启动ie浏览器报错:UnexpectederrorlaunchingInternetExplorer.ProtectedModesettingsarenotthesameforallzones错误原因是IE浏览器中的安全选项设置不一致。打开IE浏览器,进入Internet选项, 确保这四个区域的启用保护模式设置保持一致应用即可。......
  • 【Netty 从成神到升仙系列 大结局】全网一图流死磕解析 Netty 源码
    ......
  • 如何在 Kubernetes 下轻松抓取应用网络包
    在Kubernetes的实际使用过程中,我们经常会碰到一些业务上的异常问题,一般情况下通过日志监控和链路追踪足以能够对问题做出排查与诊断了。但是,在某些场景下,只靠这些手段往往是不够的,一些和网络相关的问题有时候非常棘手。奇妙的Linux世界Linux爱好者聚集地,各种硬核干货......
  • Mininet拓扑构建与命令使用
    实验目的1、通过命令模拟创建SDN网络。2、深入了解Mininet的命令使用。3、学会使用网络构建启动参数、内部交互命令及外部运行参数。实验环境Mininet拓扑构建与命令使用实验拓扑如下图所示。设备名称软件环境硬件环境主机Mininet_2.2.0_desktop_cv1.1CPU:1核内......
  • Netty实战(二)
    一、环境准备Netty需要的运行环境很简单,只有2个。JDK1.8+ApacheMaven3.3.9+二、Netty客户端/服务器概览如图,展示了一个我们将要编写的Echo客户端和服务器应用程序。该图展示是多个客户端同时连接到一台服务器。所能够支持的客户端数量,在理论上,仅受限于系统的可用资......
  • .net 6.0 获取天气相关
    之前做网站的时候,有个需求获取实时天气相关信息,找了一些开放免费的接口,过了几周发现大数据推了好多类似的帖子(真怪,需要你的时候你不来,很气,拿小本本记下了)首先里一下思路,获取天气有哪些种方式。我在查阅资料的过程中,找到了两种相对比较友好的(对应以下两个接口网站)。经纬度获取和......
  • .net开发-心情与效率
    随着现代科技的不断发展,笔记本电脑已经成为我们日常生活中不可或缺的一部分。然而,在使用笔记本电脑的过程中,我们可能会遇到一些问题,例如显示器闪烁、HDMI接口接触不良等,这些问题不仅会影响我们的工作效率,还会对我们的心情产生负面影响。首先,显示器闪烁是一种常见的问题,尤其是在光......