C#反射

本文概述

  • C#Type类
  • C#类型属性
  • C#类型方法
  • C#反射示例:获取类型
  • C#反射示例:获取程序集
  • C#反射示例:打印类型信息
  • C#反射示例:打印构造函数
  • C#反射示例:打印方法
  • C#反射示例:打印字段
在C#中,反射是在运行时获取某种类型的元数据的过程。 System.Reflection命名空间包含进行反射所需的类,例如:
  • 类型
  • 会员信息
  • ConstructorInfo
  • 方法信息
  • 现场信息
  • 物业信息
  • 类型信息
  • EventInfo
  • 模组
  • 部件
  • AssemblyName
  • 指针等
System.Reflection.Emit命名空间包含用于发出元数据的类。
C#Type类C#Type类代表类类型,接口类型,枚举类型,数组类型,值类型等的类型声明。可以在System名称空间中找到。它继承了System.Reflection.MemberInfo类。
C#类型属性Type类的重要属性的列表如下:
属性描述
Assembly获取此类型的Assembly。
AssemblyQualifiedName获取此类型的程序集限定名称。
Attributes获取与类型关联的属性。
BaseType获取基本或父类型。
FullName获取类型的标准名称。
IsAbstract用于检查类型是否为Abstract。
IsArray用于检查类型是否为数组。
IsClass用于检查类型是否为Class。
IsEnum用于检查类型是否为Enum。
IsInterface用于检查类型是否为接口。
IsNested用于检查类型是否为嵌套。
IsPrimitive用于检查类型是否为原始。
IsPointer用于检查类型是否为Pointer。
IsNotPublic用于检查类型是否不是Public。
IsPublic用于检查类型是否为“公共”。
IsSealed用于检查类型是否为密封。
IsSerializable用于检查类型是否可序列化。
MemberType用于检查类型是否为嵌套类型的成员类型。
Module获取类型的模块。
Name获取类型的名称。
Namespace获取类型的名称空间。
C#类型方法下面列出了Type类的重要方法:
方法描述
GetConstructors()返回Type的所有公共构造函数。
GetConstructors(BindingFlags)返回具有指定BindingFlags的Type的所有构造函数。
GetFields()返回类型的所有公共字段。
GetFields(BindingFlags)返回具有指定BindingFlags的Type的所有公共构造函数。
GetMembers()返回该类型的所有公共成员。
GetMembers(BindingFlags)返回具有指定BindingFlags的Type的所有成员。
GetMethods()返回Type的所有公共方法。
GetMethods(BindingFlags)返回具有指定BindingFlags的Type的所有方法。
GetProperties()返回Type的所有公共属性。
GetProperties(BindingFlags)返回具有指定BindingFlags的Type的所有属性。
GetType()获取当前的Type。
GetType(String)获取给定名称的Type。
C#反射示例:获取类型
using System; public class ReflectionExample { public static void Main() { int a = 10; Type type = a.GetType(); Console.WriteLine(type); } }

【C#反射】输出:
System.Int32

C#反射示例:获取程序集
using System; using System.Reflection; public class ReflectionExample { public static void Main() { Type t = typeof(System.String); Console.WriteLine(t.Assembly); } }

输出:
mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

C#反射示例:打印类型信息
using System; using System.Reflection; public class ReflectionExample { public static void Main() { Type t = typeof(System.String); Console.WriteLine(t.FullName); Console.WriteLine(t.BaseType); Console.WriteLine(t.IsClass); Console.WriteLine(t.IsEnum); Console.WriteLine(t.IsInterface); } }

输出:
System.String System.Object true false false

C#反射示例:打印构造函数
using System; using System.Reflection; public class ReflectionExample { public static void Main() { Type t = typeof(System.String); Console.WriteLine("Constructors of {0} type...", t); ConstructorInfo[] ci = t.GetConstructors(BindingFlags.Public | BindingFlags.Instance); foreach (ConstructorInfo c in ci) { Console.WriteLine(c); } } }

输出:
Constructors of System.String type... Void .ctor(Char*) Void .ctor(Char*, Int32, Int32) Void .ctor(SByte*) Void .ctor(SByte*, Int32, Int32) Void .ctor(SByte*, Int32, Int32, System.Text.Encoding) Void .ctor(Char[], Int32, Int32) Void .ctor(Char[]) Void .ctor(Char, Int32)

C#反射示例:打印方法
using System; using System.Reflection; public class ReflectionExample { public static void Main() { Type t = typeof(System.String); Console.WriteLine("Methods of {0} type...", t); MethodInfo[] ci = t.GetMethods(BindingFlags.Public | BindingFlags.Instance); foreach (MethodInfo m in ci) { Console.WriteLine(m); } } }

输出:
Methods of System.String type... Boolean Equals(System.Object) Boolean Equals(System.String) Boolean Equals(System.String, System.StringComparison) Char get_Chars(Int32) Void copyTo(Int32, char[], Int32, Int32) Char[] ToCharArray() ....

C#反射示例:打印字段
using System; using System.Reflection; public class ReflectionExample { public static void Main() { Type t = typeof(System.String); Console.WriteLine("Fields of {0} type...", t); FieldInfo[] ci = t.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic); foreach (FieldInfo f in ci) { Console.WriteLine(f); } } }

输出:
Fields of System.String type... System.String Empty Int32 TrimHead Int32 TrimTail Int32 TrimBoth Int32 charPtrAlignConst Int32 alignConst

    推荐阅读