Net 如何获取私有属性

这篇具有很好参考价值的文章主要介绍了Net 如何获取私有属性。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 文章来源地址https://www.toymoban.com/news/detail-457560.html

  .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 如何获取私有属性的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Kotlin】Kotlin 与 Java 互操作 ① ( 变量可空性 | Kotlin 类型映射 | Kotlin 访问私有属性 | Java 调用 Kotlin 函数 )

    在 Java 语言 中 , 任何 引用类型变量 都可以为 空 null ; Java 中 八种 基本数据类型 变量 的 默认值 为 0 或 false ; 但是在 Kotlin 语言 中 , 所有的 变量 都是引用类型变量 , 没有基本数据类型 , 默认情况下 所有的变量 都为 非空类型 ; 下面分别定义一个 Java 类 和 Kotlin 脚本 , 在 K

    2024年02月02日
    浏览(61)
  • 如何根据结构体中成员的地址获取整个结构体的首地址

    根据结构体成员地址,获取整个结构体的首地址,在Linux系统、鸿蒙lite os操作系统中是一个很重要的功能。 在Linux系统中是通过container_of宏函数实现的 container_of通过结构体内某个成员的地址和该成员的名字,以及结构体类型,找到该结构体变量的首地址。 在鸿蒙Lite os中是通

    2024年02月11日
    浏览(41)
  • 【Linux初阶】环境变量 | 如何设置、获取环境变量?

     🌟hello,各位读者大大们你们好呀🌟 🍭🍭系列专栏:【Linux初阶】 ✒️✒️本篇内容:讨论为什么指令作为一个可执行程序不需要加 ./运行;环境变量为什么会自己恢复;环境变量基本概念;常见环境变量;查看、设置、清除环境变量的方法;环境变量命令汇总;进程中

    2024年02月05日
    浏览(52)
  • Java成员变量(全局变量)和局部变量

    在Java中变量类型有 成员变量 、 局部变量 和 静态变量(类变量、static变量) ,本篇文章主要介绍成员变量(全局变量)和局部变量的区别。 根据变量的作用范围,将程序中的变量分为成员变量(全局变量)和局部变量。 一、成员变量(全局变量) 成员变量(全局变量):

    2024年02月04日
    浏览(40)
  • C++:常成员变量、常成员函数、常对象

    常成员变量: 1.用const修饰,可位于类型前后,若是成员变量类型为指针则只可位于类型后。 即:int  *const  p; 2.只能通过构造函数的初始化表对常成员变量进行初始化。 3.常成员所在类中的所有构造函数都必须对常成员变量初始化(通过初始化表)。 4.常成员变量可以被访

    2024年02月11日
    浏览(47)
  • 简述data-属性的用法(如何设置,如何获取),有何优势?

    (1)data-定义 data- 属性是全局属性,是一类被称为 自定义数据属性 的属性,它能让我们在所有html元素上嵌入自定义数据属性的能 力,并且通过脚本在HTML和DOM之间实现专有数据交换。 (2)data-用法: 属性名不应该包含任何大写字母,并且在前缀 \\\"data-\\\" 之后必须有至少一个字符

    2024年02月16日
    浏览(41)
  • js如何获取对象中的所有属性

    循环遍历对象的 所有属性 ,并逐个输出它们的值;每次执行时,都会将一个属性名赋值给所定义的变量 输出一个对象的所有 属性名 ,该方法返回一个数组,数组内包括对象内可枚举属性 输出一个对象的所有 属性值 。该方法返回一个数组,数组内包含对象自身所有可枚举

    2024年02月11日
    浏览(45)
  • javaScript 如何获取对象中非空的属性

    要获取JavaScript对象中所有具有值的属性,您可以使用 Object.entries()方法结合Array.prototype.filter()方法。以下是一个示例代码: 在上述示例中,我们定义了一个带有多个属性的对象 obj 。其中, city 属性的值为空字符串。 使用 Object.entries(obj) 可以将一个对象转换为包含  键值对

    2024年02月15日
    浏览(42)
  • 【C++练习】普通方法+利用this 设置一个矩形类(Rectangle), 包含私有成员长(length)、 宽(width), 定义一下成员函数

    设置一个矩形类(Rectangle), 包含私有成员长(length)、 宽(width), 定义成员函数:         void set_ len(int l);  //设置长度         设置宽度void set_ wid(int w);          获取长度: int get len();          获取宽度: int get _wid);          显示周长和面积: void show();   

    2024年02月11日
    浏览(39)
  • C++笔记之静态成员函数可以在类外部访问私有构造函数吗?

    参考笔记: 1.C++笔记之静态成员函数可以在类外部访问私有构造函数吗? 2.C++笔记之设计模式:setter函数、依赖注入 3.C++笔记之两个类的实例之间传递参数——通过构造函数传递类对象的方法详细探究 4.C++笔记之智能指针和单例、依赖注入结合使用 5.C++笔记之两个类的实例之

    2024年02月11日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包