.net 反射访问私有变量和私有方法

以下为本次实践代码:

复制代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleTest
{
    class Program
    {
        static void Main(string[] args)
        {
            //反射读取类私有属性
            Person per = new Person("ismallboy", "20102100104");
            Type t = per.GetType();
            //获取私有方法
            MethodInfo method = t.GetMethod("GetStuInfo", BindingFlags.NonPublic | BindingFlags.Instance);
            //访问无参数私有方法
            string strTest = method.Invoke(per, null).ToString();
            //访问有参数私有方法
            MethodInfo method2 = t.GetMethod("GetValue", BindingFlags.NonPublic | BindingFlags.Instance);
            object[] par = new object[2];
            par[0] = "ismallboy";
            par[1] = 2;
            string strTest2 = method2.Invoke(per, par).ToString();

            //获取私有字段
            PropertyInfo field = t.GetProperty("Name", BindingFlags.NonPublic | BindingFlags.Instance);
            //访问私有字段值
            string value = field.GetValue(per).ToString();
            //设置私有字段值
            field.SetValue(per, "new Name");
            value = field.GetValue(per).ToString();
        }
    }

    /// <summary>
    /// 个人信息
    /// </summary>
    class Person
    {
        private string Name { get; set; }
        private string StuNo { get; set; }

        public Person(string name, string stuNo)
        {
            this.Name = name;
            this.StuNo = stuNo;
        }

        private string GetStuInfo()
        {
            return this.Name;
        }

        private string GetValue(string str, int n)
        {
            return str + n.ToString();
        }
    }
}
复制代码

如果使用dynamic的话,也可以如下:

复制代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleTest
{
    class Program
    {
        static void Main(string[] args)
        {
            //反射读取类私有属性
            dynamic per = new Person("ismallboy", "20102100104");
            Type t = per.GetType();
            //获取私有方法
            MethodInfo method = t.GetMethod("GetStuInfo", BindingFlags.NonPublic | BindingFlags.Instance);
            //访问无参数私有方法
            string strTest = method.Invoke(per, null);
            //访问有参数私有方法
            MethodInfo method2 = t.GetMethod("GetValue", BindingFlags.NonPublic | BindingFlags.Instance);
            object[] par = new object[2];
            par[0] = "ismallboy";
            par[1] = 2;
            string strTest2 = method2.Invoke(per, par);

            //获取私有字段
            PropertyInfo field = t.GetProperty("Name", BindingFlags.NonPublic | BindingFlags.Instance);
            //访问私有字段值
            string value = field.GetValue(per);
            //设置私有字段值
            field.SetValue(per, "new Name");
            value = field.GetValue(per);
        }
    }

    /// <summary>
    /// 个人信息
    /// </summary>
    class Person
    {
        private string Name { get; set; }
        private string StuNo { get; set; }

        public Person(string name, string stuNo)
        {
            this.Name = name;
            this.StuNo = stuNo;
        }

        private string GetStuInfo()
        {
            return this.Name;
        }

        private string GetValue(string str, int n)
        {
            return str + n.ToString();
        }
    }
}
复制代码

 

以上图片由“图斗罗”提供

posted @   浅苍蓝  阅读(1135)  评论(1编辑  收藏  举报
编辑推荐:
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 程序员常用高效实用工具推荐,办公效率提升利器!
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
点击右上角即可分享
微信分享提示