ibcadmin 发表于 2016-7-28 11:39:22

C#使用反射访问对象属性方法

此教程转载博客园,代码未经本人测试。

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


先上代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using System.Linq;
using System.Reflection;

public class reflectModel
    {

      public static void TestShowReflect()
      {
            //反射读取类私有属性
            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;
            par = "ismallboy";
            par = 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();
      }
    }

reflectModel


ibcadmin 发表于 2016-7-28 11:39:33

111

Amy尾巴 发表于 2016-7-28 11:41:10

222
页: [1]
查看完整版本: C#使用反射访问对象属性方法