C#反射

2021-06-11 18:05

阅读:693

标签:vat   赋值   val   str   intern   span   setvalue   获取   方法   

using System;
using System.Reflection; //反射

//反射:可以通过类名、成员的名字来进行对象的实例化、操作类成员
class Person
{
    public int a;
    private int b;
    public static int c;
    private static int d;

    //private Person()
        //public Person()
    internal Person()
    {
        Console.WriteLine("Person类无参的构造方法被调用");
        Console.ReadLine();
    }
    private Person(int a, double b, string c)
    {
        Console.WriteLine("Person类有参的构造方法被调用");
        Console.ReadLine();
    }

    public void ShowA() { }
    private void ShowB() { }
    public static void ShowC() { }
    private static void ShowD() { }
    public int Show(int a, double b) {
        return a;
    }
    private double Show(double a, int b)
    {
        return b;
    }
}
class Program
{
    static void Main(string[] args)
    {
        //实例化一个Person对象
        //通过类名来获取一个类型
        //命名空间:如果这个类在一个命名空间中,那么在写类型名的时候需要加上命名空间
        //例如:systm.Int32
            Type t = Type.GetType("Person");
        //实例化一个对象,默认使用public权限的无参的构造方法来实例化
        // object obj = Activator.CreateInstance(t);

        //实例化一个对象,true表示如果公共或非公共默认构造函数都可以匹配
        //fales 表示只有公共的默认构造函数可以匹配
        //object obj = Activator.CreateInstance(t,true );

        //实例化一个对象,是通过public权限的有参的构造方法来实例化
        //object obj = Activator.CreateInstance(t, 1,3.1,"hello");

        //实例化一个对象,通过非public权限的有参构造方法来实例化
        object obj = Activator.CreateInstance(t, BindingFlags.NonPublic|BindingFlags.Instance,null,new object[]{ 1,2.3,"hello"},null);

        //BindingFlags:要访问的方法或字段的权限描述,必须要同时具备两个描述
        //1.要有要访问的成员的权限描述 BindingFlags.NonPublic   BindingFlags.Public
        //2.要有要访问的成员的归属  静态的:BindingFlags.Static  非静态的:BindingFlags.Instance



        //通过反射访问类中的字段
        //1.访问public权限的非静态的字段a
        FieldInfo a = t.GetField("a");
        a.SetValue(obj,1); //给obj对象的a字段进行赋值,值为1
        object aa = a.GetValue(obj); //获取对象obj的字段a的值

        //2.访问private权限的非静态的字段b
        FieldInfo b = t.GetField("b",BindingFlags.NonPublic|BindingFlags.Instance);
        b.SetValue(obj, 3);
        object bb = b.GetValue(obj);

        //3.访问public权限的静态的字段c
        FieldInfo c = t.GetField("c", BindingFlags.Public | BindingFlags.Static);
        c.SetValue(null,5);  //如果要访问的是一个静态的成员,则访问的主体是null
        object cc = c.GetValue(null);

        //4.访问private权限的静态的字段d
        FieldInfo d = t.GetField("d", BindingFlags.NonPublic | BindingFlags.Static);
        d.SetValue(null, 3);
        object dd = d.GetValue(null);


        //通过反射访问类中的方法
        //1.获取没有参数的方法
        MethodInfo method0 = t.GetMethod("ShowD", BindingFlags.NonPublic | BindingFlags.Static);

        //方法调用,第一个参数是谁在调用方法,第二个参数是调用的方法的实参列表
        method0.Invoke(null,null);

        //2.获取有参数有重载的方法
        //Type数组中传要访问的方法的参数类型列表 
        //typeof 来获取已知类型
        MethodInfo method1 = t.GetMethod("Show", BindingFlags.Public | BindingFlags.Instance, null,new Type[] {typeof(int),typeof(double)},null);
        //第二个参数是实参列表
        //Invoke方法的返回值,就是method1方法的返回值
        object result = method1.Invoke(obj, new object[] { 1, 1.45 });
        Console.WriteLine(result);
    }
}

 

C#反射

标签:vat   赋值   val   str   intern   span   setvalue   获取   方法   

原文地址:https://www.cnblogs.com/zySun622/p/10556128.html


评论


亲,登录后才可以留言!