C#反射类Type用法举例

概述

     程序运行时,通过反射可以得到其它程序集或者自己程序集代码的各种信息,包括类、函数、变量等来实例化它们,执行它们,操作它们,实际上就是获取程序在内存中的映像,然后基于这个映像进行各种操作。

Type用法举例

Type对象用来获取对象的类型信息,如:构造函数、方法、字段、属性和类的事件等。Type的用法有以下三种:

方法1:直接通过typeof获取类型;

方法2:通过类型实例获取类型a.GetType(); .

方法3:通过Type类的静态方法Type.GetType("System.String");

用法举例:

   string a = "zls";            var c1 = typeof(string);            var c2 = a.GetType();            var c3 = Type.GetType("System.String");
            Console.WriteLine($"c1类型:{c1}");            Console.WriteLine($"c2类型:{c2}");            Console.WriteLine($"c3类型:{c3}");            Console.ReadKey();

运行结果:

C#反射类Type用法举例

其中方法3有六个重载方法,F12可以查看详细解释,如果要忽略大小写搜索,可以用以下这个重载:将ignoreCase设置为true

public static Type GetType(string typeName, bool throwOnError, bool ignoreCase);

获取类型的详细信息,如下:

            Console.WriteLine("命名空间:" + c1.Namespace);            Console.WriteLine("基类型:" + c1.BaseType);            Console.WriteLine("全名称:" + c1.FullName);            Console.WriteLine("是否是类:" + c1.IsClass);            Console.WriteLine("是否是公共类型:" + c1.IsPublic);            Console.WriteLine("类型所在程序集:" + c1.Assembly);

C#反射类Type用法举例

Type常用方法介绍

① 如果要获取获取类中的所有公共成员,可以使用GetMembers();

        //        // 摘要:        //     返回为当前 System.Type 的所有公共成员。        //        // 返回结果:        //     表示当前 System.Reflection.MemberInfo 的所有公共成员的 System.Type 对象数组。- 或 - 如果当前 System.Reflection.MemberInfo        //     没有公共成员,则为 System.Type 类型的空数组。        public MemberInfo[] GetMembers();

MemberInfo[]位于名称空间System.Reflection下,所以需要引用下.

用法举例:

 MemberInfo[] infos = c3.GetMembers();            for (int i = 0; i < infos.Length; i++)            {                Console.WriteLine(infos[i]);            }

运行结果:

C#反射类Type用法举例

② 此外你也也可以获取类的公共构造函数并调用,

 ConstructorInfo[] ctors = c1.GetConstructors();

比如这里定义一个学生类型:

 public class Student    {        public Student()        {            Name = "zls";            Age = 18;        }
        public string Name { get; set; }        public int Age { get; set; }    }

然后获取学生的年龄:

  var t1 = typeof(Student);            //得到无参构造函数            ConstructorInfo info = t1.GetConstructor(new Type[0]);            //执行无参构造 无参构造没有参数传null            Student obj = info.Invoke(null) as Student;            Console.WriteLine(obj.Age);

运行结果:18

③  获取所有公共属性

  PropertyInfo[] propertyInfos = c1.GetProperties();

用法举例:

 var t1 = typeof(Student);            //得到无参构造函数            ConstructorInfo info = t1.GetConstructor(new Type[0]);            //执行无参构造 无参构造没有参数传null            Student obj = info.Invoke(null) as Student;            Console.WriteLine(obj.Age);
            PropertyInfo infoJ = t1.GetProperty("Age");            Console.WriteLine(infoJ.GetValue(obj));

C#反射类Type用法举例

④ 获取所有公共字段:

 FieldInfo[] fileldInfos = t.GetFields();

给学生类增加一个字段:

public class Student    {        public Student()        {            Name = "zls";            Age = 18;            id = 20;        }
        public string Name { get; set; }        public int Age { get; set; }
        public int id;    }

然后获取字段值

 var t1 = typeof(Student);            //得到无参构造函数            ConstructorInfo info = t1.GetConstructor(new Type[0]);            //执行无参构造 无参构造没有参数传null            Student obj = info.Invoke(null) as Student;            Console.WriteLine(obj.Age);
            PropertyInfo infoJ = t1.GetProperty("Age");            Console.WriteLine(infoJ.GetValue(obj));
            FieldInfo inf = t1.GetField("id");            Console.WriteLine(inf.GetValue(obj));

C#反射类Type用法举例

当然除了上面获取属性和字段值的方法我们也可以设置他的值:

方法如下:

  inf.SetValue(obj, 99);            Console.WriteLine(inf.GetValue(obj));

C#反射类Type用法举例

⑤ 获取类的公共成员方法,获取成员方法可以通过Type类中的GetMethod方法来得到类中的方法,MethodInfo是方法的反射信息。

  MethodInfo[] methods = c1.GetMethods();

这里不详细介绍用法.