zoukankan      html  css  js  c++  java
  • .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();
            }
        }
    }

     

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

  • 相关阅读:
    IDE-Android Studio 导入Ecplise项目不改变结构
    IDE-Android Studio -FAQ-使用习惯(不断更新 欢迎留言)
    IDE-Ecplise-代码注释 模版 编码规范 配色
    android- 远程调试
    phpstorm所有快捷键表格pdf
    phpstorm修改字体和大小
    phpstorm重构代码形式让阅读更简单
    七牛云到底好不好使用经历分享
    一篇文章搞懂php中类型转换
    彻底解决php判断a==0为真引发的问题-类型转换
  • 原文地址:https://www.cnblogs.com/ldyblogs/p/net.html
Copyright © 2011-2022 走看看