反射

反射:  这是.Net中获取运行时类型信息的方式,  应用程序由程序集(assembly),模块(module), (class)组成.而反射提供一种编程的方式,让程序员可以在程序运行期获得这几个组成部分的相关信息

比如:

 Assembly类可以获得正在运行的装配件信息,也可以动态的加载装配件,以及在装配件中查找类型信息,并创建该类型的实例。
Type类可以获得对象的类型信息,此信息包含对象的所有要素:方法、构造器、属性等等,通过Type类可以得到这些要素的信息,并且调用之。
MethodInfo包含方法的信息,通过这个类可以得到方法的名称、参数、返回值等,并且可以调用之。
诸如此类,还有FieldInfo、EventInfo等等,这些类都包含在System.Reflection命名空间下。

引用命名空间:using System.Reflection;

反射的核心类:Type

例如:MyClass类

 class MyClass

    {

        public int zoo=1;

        public string Name { get; set; }

        public void Test(int a)

        {

            Console.WriteLine(a);

        }

        public void Test1<T>(T i)

        {

            Console.WriteLine(i);

        }

    }

获得属性信息:PropertyInfo

 //属性

            Type t = typeof(MyClass);  //实例化类型

            object obj = Activator.CreateInstance(t); //生成对象

            var tt = t.GetProperties();  //获取所有属性信息

            foreach (var item in tt)

            {

                item.SetValue(obj, "张三");//属性赋值

                Console.WriteLine(item.Name);  //查看属性的名称

                Console.WriteLine(item.PropertyType.Name);  //查看属性的数据类型

                Console.WriteLine(item.GetValue(obj));//获取属性的值

            }

获得方法信息:MethodInfo

 //方法

            MethodInfo m = t.GetMethod("Test");  //获得Test方法

            object[] Parmets = new object[] { 10 };  //需要传的参数

            m.Invoke(obj, Parmets);

//泛型方法

 Assembly assembly1 = Assembly.Load("ConsoleApp1");  //加载ConsoleApp1命名空间

            Type t1 = assembly1.GetType("ConsoleApp1.MyClass")//ConsoleApp1下的mycalss类;

            object obj = Activator.CreateInstance(t1);  //实例对象

            MethodInfo m = t1.GetMethod("Test1"); //获得Test1的放法

            var o = new object[] { 4 }; //参数

            var m2 =m.MakeGenericMethod(new Type[] { typeof(int) }).Invoke(obj,o); //调用

原文地址:https://www.cnblogs.com/gbb44/p/10636290.html