• .NET中使用反射访问属性方法


    .net所编写的程序集包含两个重要部分:IL(中间语言代码) 和metadata(元数据)。我们编写的代码中不是有很多很多的类吗,类有很多很多的成员,在编译代码的时候,元数据表就根据代码把类的所有信息都记录在了它里面(其实它就是一个数据结构,组织类的信息)。
    而反射的过程刚好相反,就是通过元数据里记录的关于类的详细信息找到该类的成员,并能使它“复活”(因为元数据里所记录的信息足够详细,以致于可以根据metadata里面记录的信息找到关于该类的IL code并加以利用)。
    最后对比下:
    元数据形成:根据代码具体内容形成类的记录信息;
    反射:根据元数据的记录找到所需的代码;

    先上代码:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 using System.ComponentModel;
     7 using System.Linq;
     8 using System.Reflection;
     9 
    10  public class reflectModel
    11     {
    12 
    13         public static void TestShowReflect()
    14         {
    15             //反射读取类私有属性
    16             Person per = new Person("ismallboy", "20102100104");
    17             Type t = per.GetType();
    18             //获取私有方法
    19             MethodInfo method = t.GetMethod("GetStuInfo", BindingFlags.NonPublic | BindingFlags.Instance);
    20             //访问无参数私有方法
    21             string strTest = method.Invoke(per, null).ToString();
    22             //访问有参数私有方法
    23             MethodInfo method2 = t.GetMethod("GetValue",         BindingFlags.NonPublic | BindingFlags.Instance);
    24             object[] par = new object[2];
    25             par[0] = "ismallboy";
    26             par[1] = 2;
    27             string strTest2 = method2.Invoke(per, par).ToString();
    28 
    29             //获取私有字段
    30             PropertyInfo field = t.GetProperty("Name", BindingFlags.NonPublic | BindingFlags.Instance);
    31             //访问私有字段值
    32             string value = field.GetValue(per).ToString();
    33             //设置私有字段值
    34             field.SetValue(per, "new Name");
    35             value = field.GetValue(per).ToString();
    36         }
    37     }
    38 
    39 
    40 /// <summary>
    41     /// 个人信息
    42     /// </summary>
    43     class Person
    44     {
    45         private string Name { get; set; }
    46         private string StuNo { get; set; }
    47 
    48         public Person(string name, string stuNo)
    49         {
    50             this.Name = name;
    51             this.StuNo = stuNo;
    52         }
    53 
    54         private string GetStuInfo()
    55         {
    56             return this.Name;
    57         }
    58 
    59         private string GetValue(string str, int n)
    60         {
    61             return str + n.ToString();
    62         }
    63     }
    reflectModel
  • 相关阅读:
    浅析[53300] FATAL: remaining connection slots are reserved for non-replication superuser connections
    浅析Web安全漏洞里的X-Frame-Options、X-XSS-Protection、X-Content-Type-Options响应头配置以及如何通过nginx配置避免
    浅析SpringSecurity的方法级安全管控
    浅析mybatis的全局配置文件mybatis-config.xml各配置的意义
    字节序--大端字节序和小端
    【转】go语言中int和byte转换方式
    [转]float32数据在内存中的存储方法
    go语言复制一个struct 对象
    一个table 中 可以有多个tbody. table 可以嵌套
    【转】rpc框架设计
  • 原文地址:https://www.cnblogs.com/BookCode/p/5294442.html
Copyright © 2020-2023  润新知