反射

using System;
using System.Reflection;

/// <summary>
/// 反射:可以通过类名、成员的名字进行对象的实例化、操作类成员。
/// </summary>

namespace Per
{
    class Person
    {
        public int a;
        private int b;
        public static int c;
        private static int d;

        private Person()
        {
            Console.WriteLine("Person类无参构造方法被调用");
        }
        private Person(int a, string b)
        {
            Console.WriteLine("Person类有参参构造方法被调用");
        }

        public void ShowA()
        {
            Console.WriteLine(a);
        }
        private void ShowB()
        {
            Console.WriteLine(b);
        }
        public static void ShowC()
        {
            Console.WriteLine(c);
        }
        private static void ShowD()
        {
            Console.WriteLine(d);
        }
        public int Show(int num1, double num2)
        {
            return num1;
        }
        private double Show(double num1, int num2)
        {
            return num1;
        }
    }
}

namespace ReflectTest
{
    class Program
    {
        static void Main(string[] args)
        {
            /*
             BindingFlags:要访问的方法或者字段的访问权限描述,必须要具备两个:
             1、要有访问权限的描述 BindingFlags.NonPublic:非公开类;BindingFlags.Public:公开类
             2、要有访问的成员归属 BindingFlags.Instance:非静态;BindingFlags.Static:静态
             */
            #region 实例化一个Person对象
            //通过类名来获取一个类型
            //命名空间:如果这个类在一个命名空间中,写类型名字的时候则需要加上命名空间

            //Type t = typeof(Per.Person);
            Type t = Type.GetType("Per.Person");

            //实例化一个对象,默认使用public权限的无参构造方法来实例化
            //object obj = Activator.CreateInstance(t);

            //实例化一个对象,如果为true,可以匹配任何权限的无参构造方法来实例化
            //object obj = Activator.CreateInstance(t,true);

            //实例化一个对象,如果为true,有使用public权限参构造方法来实例化
            //object obj = Activator.CreateInstance(t, 1, "小明");

            //实例化一个对象,如果为true,有参构造方法来实例化
            object obj = Activator.CreateInstance(t, BindingFlags.NonPublic | BindingFlags.Instance, null, new object[] { 1, "xiaoming" }, null);

            #endregion


            #region 通过反射访问类中的字段
            //访问public非静态字段a

            FieldInfo a = t.GetField("a");
            //给obj对象的a赋值为10
            a.SetValue(obj, 10);
            object aa = a.GetValue(obj);
            Console.WriteLine("aa==" + aa);
            //访问非public非静态字段b

            FieldInfo b = t.GetField("b", BindingFlags.NonPublic | BindingFlags.Instance);
            //给obj对象的a赋值为10
            b.SetValue(obj, 10);
            object bb = b.GetValue(obj);
            Console.WriteLine("bb==" + bb);
            //访问public静态字段c

            FieldInfo c = t.GetField("c", BindingFlags.Public | BindingFlags.Static);
            //给obj对象的a赋值为10,如果访问的对象是静态的,访问主体建议使用ull
            c.SetValue(null, 10);
            object cc = c.GetValue(null);
            Console.WriteLine("cc==" + cc);
            //访问非public静态字段d

            FieldInfo d = t.GetField("d", BindingFlags.NonPublic | BindingFlags.Static);
            //给obj对象的a赋值为10,如果访问的对象是静态的,访问主体建议使用ull
            d.SetValue(null, 10);
            object dd = d.GetValue(null);
            Console.WriteLine("dd==" + dd);
            #endregion

            #region 通过反射访问类中的方法
            //获取没参数的方法,静态对象使用null
            MethodInfo method0 = t.GetMethod("ShowA", BindingFlags.Public | BindingFlags.Instance);
            //方法调用:
            //第一个参数:谁在调用方法
            //第二个参数:调用方法的实参列表
            method0.Invoke(obj, null);
            MethodInfo method1 = t.GetMethod("ShowC", BindingFlags.Public | BindingFlags.Static);
            method1.Invoke(null, null);

            //获取有参数有重载的方法
            //Type  数组中传入要访问方法的参数类型
            MethodInfo method2 = t.GetMethod("Show", BindingFlags.Public | BindingFlags.Instance, null, new Type[] { typeof(int), typeof(double) }, null);
            object result = method2.Invoke(obj, new object[] { 1, 3.14 });
            Console.WriteLine(result);
            #endregion
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值