.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(); } } }
以上图片由“图斗罗”提供
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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)