类对于反射起着核心的作用。当反射请求加载的类型时,公共语言运行库将为它创建一个 Type。您可以使用 Type 对象的方法、字段、属性和嵌套类来查找有关该类型的所有信息。
使用 或 从尚未加载的程序集中获取 Type 对象,并传入所需类型的名称。使用 可从已加载的程序集中获取 Type 对象。使用 和 可获取模块 Type 对象。
注意: |
---|
如果想要检查并操作泛型类型和方法,请参见 和如何:使用反射检查和实例化泛型类型 中提供的其他信息。 |
下面的示例显示在获取程序集的 对象和模块时所必需的语法。
C# | 复制代码 |
---|---|
// Gets the mscorlib assembly in which the object is defined. Assembly a = typeof(Object).Module.Assembly; |
下面的示例说明如何从已加载的程序集中获取 Type 对象。
C# | 复制代码 |
---|---|
// Loads an assembly using its file name. Assembly a = Assembly.LoadFrom ("MyExe.exe"); // Gets the type names from the assembly. Type [] types2 = a.GetTypes (); foreach (Type t in types2) { Console.WriteLine (t.FullName); } |
在获取了一个 Type 后,您可以采用许多方法来发现与该类型的成员有关的信息。例如,通过调用 方法(该方法将获取对当前类型的每个成员进行描述的一组 对象),您可以找到有关该类型的所有成员的信息。
您也可以在 Type 类上使用方法,以检索有关按名称指定的一个或多个构造函数、方法、事件、字段或属性的信息。例如, 封装当前类的特定构造函数。
如果具有 Type,则可以使用 属性来获取一个封装该类型所在模块的对象。使用 属性可查找封装模块所在程序集的对象。使用 属性可直接获取封装该类型的程序集。
System.Type 和 ConstructorInfo
下面的示例演示如何列出一个类(此示例中为 类)的构造函数。
C# | 复制代码 |
---|---|
// This program lists all the public constructors // of the System.String class. using System; using System.Reflection; class ListMembers { public static void Main(String[] args) { Type t = typeof(System.String); Console.WriteLine ("Listing all the public constructors of the {0} type", t); // Constructors. ConstructorInfo[] ci = t.GetConstructors(BindingFlags.Public | BindingFlags.Instance); Console.WriteLine ("//Constructors"); PrintMembers (ci); } public static void PrintMembers(MemberInfo [] ms) { foreach (MemberInfo m in ms) { Console.WriteLine ("{0}{1}", " ", m); } Console.WriteLine(); } } |
MemberInfo、MethodInfo、FieldInfo 和 PropertyInfo
使用 、 、 或 对象获取有关该类型的方法、属性、事件和字段的信息。
下面的示例使用 MemberInfo 列出 System.IO.File 类中的成员数量并使用 属性确定该类的可见性。
C# | 复制代码 |
---|---|
using System; using System.IO; using System.Reflection; class Mymemberinfo { public static void Main(string[] args) { Console.WriteLine ("\nReflection.MemberInfo"); // Gets the Type and MemberInfo. Type MyType =Type.GetType("System.IO.File"); MemberInfo[] Mymemberinfoarray = MyType.GetMembers(); // Gets and displays the DeclaringType method. Console.WriteLine("\nThere are {0} members in {1}.", Mymemberinfoarray.Length, MyType.FullName); Console.WriteLine("{0}.", MyType.FullName); if (MyType.IsPublic) { Console.WriteLine("{0} is public.", MyType.FullName); } } } |
下面的示例调查指定成员的类型。它对 MemberInfo 类的一个成员执行反射,然后列出其类型。
C# | 复制代码 |
---|---|
// This code displays information about the GetValue method of FieldInfo. using System; using System.Reflection; class MyMethodInfo { public static int Main() { Console.WriteLine("Reflection.MethodInfo"); // Gets and displays the Type. Type MyType = Type.GetType("System.Reflection.FieldInfo"); // Specifies the member for which you want type information. MethodInfo Mymethodinfo = MyType.GetMethod("GetValue"); Console.WriteLine(MyType.FullName + "." + Mymethodinfo.Name); // Gets and displays the MemberType property. MemberTypes Mymembertypes = Mymethodinfo.MemberType; if (MemberTypes.Constructor == Mymembertypes) { Console.WriteLine("MemberType is of type All"); } else if (MemberTypes.Custom == Mymembertypes) { Console.WriteLine("MemberType is of type Custom"); } else if (MemberTypes.Event == Mymembertypes) { Console.WriteLine("MemberType is of type Event"); } else if (MemberTypes.Field == Mymembertypes) { Console.WriteLine("MemberType is of type Field"); } else if (MemberTypes.Method == Mymembertypes) { Console.WriteLine("MemberType is of type Method"); } else if (MemberTypes.Property == Mymembertypes) { Console.WriteLine("MemberType is of type Property"); } else if (MemberTypes.TypeInfo == Mymembertypes) { Console.WriteLine("MemberType is of type TypeInfo"); } return 0; } } |
下面的示例使用所有的反射 *Info 类以及 来列出指定类的所有成员(构造函数、字段、属性、事件和方法),并将这些成员划分为静态和实例类别。
C# | 复制代码 |
---|---|
// This program lists all the members of the // System.IO.BufferedStream class. using System; using System.IO; using System.Reflection; class ListMembers { public static void Main(String[] args) { // Specifies the class. Type t = typeof (System.IO.BufferedStream); Console.WriteLine ("Listing all the members (public and non public) of the {0} type", t); // Lists static fields first. FieldInfo [] fi = t.GetFields (BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public); Console.WriteLine ("// Static Fields"); PrintMembers (fi); // Static properties. PropertyInfo [] pi = t.GetProperties (BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public); Console.WriteLine ("// Static Properties"); PrintMembers (pi); // Static events. EventInfo [] ei = t.GetEvents (BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public); Console.WriteLine ("// Static Events"); PrintMembers (ei); // Static methods. MethodInfo [] mi = t.GetMethods (BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public); Console.WriteLine ("// Static Methods"); PrintMembers (mi); // Constructors. ConstructorInfo [] ci = t.GetConstructors (BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); Console.WriteLine ("// Constructors"); PrintMembers (ci); // Instance fields. fi = t.GetFields (BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); Console.WriteLine ("// Instance Fields"); PrintMembers (fi); // Instance properites. pi = t.GetProperties (BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); Console.WriteLine ("// Instance Properties"); PrintMembers (pi); // Instance events. ei = t.GetEvents (BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); Console.WriteLine ("// Instance Events"); PrintMembers (ei); // Instance methods. mi = t.GetMethods (BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); Console.WriteLine ("// Instance Methods"); PrintMembers (mi); Console.WriteLine ("\r\nPress ENTER to exit."); Console.Read(); } public static void PrintMembers (MemberInfo [] ms) { foreach (MemberInfo m in ms) { Console.WriteLine ("{0}{1}", " ", m); } Console.WriteLine(); } } |