查看类型信息
System.Type 类是反射的中心。 当反射提出请求时,公共语言运行时为已加载的类型创建 Type
。 可使用 Type
对象的方法、字段、属性和嵌套类来查找该类型的任何信息。
使用 Assembly.GetType 或 Assembly.GetTypes 从尚未加载的程序集中获取 Type
对象,传入所需类型的名称。 使用 Type.GetType 从已加载的程序集中获取 Type
对象。 使用 Module.GetType 和 Module.GetTypes 获取模块 Type
对象。
注意
要检查和操纵泛型类型及方法,请参阅反射类型和泛型类型和如何:使用反射检查和实例化泛型类型中提供的其他信息。
下列示例演示获取程序集的 Assembly 对象和模块所必需的语法。
// Gets the mscorlib assembly in which the object is defined.
Assembly^ a = Object::typeid->Module->Assembly;
// Gets the mscorlib assembly in which the object is defined.
Assembly a = typeof(object).Module.Assembly;
' Gets the mscorlib assembly in which the object is defined.
Dim a As Assembly = GetType(Object).Module.Assembly
下列示例演示如何从已加载的程序集获取 Type
对象。
// Loads an assembly using its file name.
Assembly^ a = Assembly::LoadFrom("MyExe.exe");
// Gets the type names from the assembly.
array<Type^>^ types2 = a->GetTypes();
for each (Type^ t in types2)
{
Console::WriteLine(t->FullName);
}
// 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);
}
' Loads an assembly using its file name.
Dim a As Assembly = Assembly.LoadFrom("MyExe.exe")
' Gets the type names from the assembly.
Dim types2() As Type = a.GetTypes()
For Each t As Type In types2
Console.WriteLine(t.FullName)
Next t
一旦获取 Type
对象,可通过多种方式来查看该类型成员的相关信息。 例如,可调用 Type.GetMembers 方法查找所有类型的成员,获取一组描述当前类型各成员的 MemberInfo 对象。
还可以使用 Type
类上的方法来检索按名称指定的一个或多个构造函数、方法、事件、字段或属性的相关信息。 例如,Type.GetConstructor 封装当前类的特定构造函数。
如果有 Type
,可使用 Type.Module 属性获取一个封装含该类型的模块的对象。 使用 Module.Assembly 属性查找一个封装含该模块的程序集的对象。 可以获取直接使用 Type.Assembly 属性封装类型的程序集。
System.Type 和 ConstructorInfo
下列示例演示如何列出类的构造函数,在本例中即指 String 类。
// This program lists all the public constructors
// of the System.String class.
using namespace System;
using namespace System::Reflection;
class ListMembers
{
public:
static void Main()
{
Type^ t = System::String::typeid;
Console::WriteLine ("Listing all the public constructors of the {0} type", t);
// Constructors.
array<ConstructorInfo^>^ ci = t->GetConstructors(BindingFlags::Public | BindingFlags::Instance);
Console::WriteLine ("//Constructors");
PrintMembers(ci);
}
static void PrintMembers(array<MemberInfo^>^ ms)
{
for each (MemberInfo^ m in ms)
{
Console::WriteLine ("{0}{1}", " ", m);
}
Console::WriteLine();
}
};
int main()
{
ListMembers::Main();
}
// This program lists all the public constructors
// of the System.String class.
using System;
using System.Reflection;
class ListMembers
{
public static void Main()
{
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();
}
}
' This program lists all the public constructors
' of the System.String class.
Imports System.Reflection
Class ListMembers
Public Shared Sub Main()
Dim t As Type = GetType(String)
Console.WriteLine("Listing all the public constructors of the {0} type", t)
' Constructors.
Dim ci As ConstructorInfo() = t.GetConstructors((BindingFlags.Public Or BindingFlags.Instance))
Console.WriteLine("//Constructors")
PrintMembers(ci)
End Sub
Public Shared Sub PrintMembers(ms() As MemberInfo)
Dim m As MemberInfo
For Each m In ms
Console.WriteLine("{0}{1}", " ", m)
Next m
Console.WriteLine()
End Sub
End Class
MemberInfo、MethodInfo、FieldInfo 和 PropertyInfo
使用 MemberInfo、MethodInfo、FieldInfo 或 PropertyInfo 对象获取类型的方法、属性、事件和字段的相关信息。
下列示例使用 MemberInfo
列出 System.IO.File
类中成员的数量,并使用 IsPublic 属性确定类的可见性。
using namespace System;
using namespace System::IO;
using namespace System::Reflection;
public ref class MyMemberInfo
{
public:
static void Main()
{
Console::WriteLine ("\nReflection.MemberInfo");
// Gets the Type and MemberInfo.
Type^ myType = Type::GetType("System.IO.File");
array<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);
}
}
};
int main()
{
MyMemberInfo::Main();
}
using System;
using System.IO;
using System.Reflection;
class MyMemberInfo
{
public static void Main()
{
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);
}
}
}
Imports System.IO
Imports System.Reflection
Class MyMemberInfo
Public Shared Sub Main()
Console.WriteLine("\nReflection.MemberInfo")
' Gets the Type and MemberInfo.
Dim myType As Type = Type.GetType("System.IO.File")
Dim myMemberInfoArray() As MemberInfo = 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)
End If
End Sub
End Class
下列示例调查指定成员的类型。 它在 MemberInfo
类的成员上执行反射,并列出该成员的类型。
// This code displays information about the GetValue method of FieldInfo.
using namespace System;
using namespace System::Reflection;
public ref 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;
}
};
int main()
{
MyMethodInfo::Main();
}
// 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;
}
}
' This code displays information about the GetValue method of FieldInfo.
Imports System.Reflection
Class MyMethodInfo
Public Shared Sub Main()
Console.WriteLine("Reflection.MethodInfo")
' Gets and displays the Type.
Dim myType As Type = Type.GetType("System.Reflection.FieldInfo")
' Specifies the member for which you want type information.
Dim myMethodInfo As MethodInfo = myType.GetMethod("GetValue")
Console.WriteLine((myType.FullName & "." & myMethodInfo.Name))
' Gets and displays the MemberType property.
Dim myMemberTypes As MemberTypes = myMethodInfo.MemberType
If MemberTypes.Constructor = myMemberTypes Then
Console.WriteLine("MemberType is of type All")
ElseIf MemberTypes.Custom = myMemberTypes Then
Console.WriteLine("MemberType is of type Custom")
ElseIf MemberTypes.Event = myMemberTypes Then
Console.WriteLine("MemberType is of type Event")
ElseIf MemberTypes.Field = myMemberTypes Then
Console.WriteLine("MemberType is of type Field")
ElseIf MemberTypes.Method = myMemberTypes Then
Console.WriteLine("MemberType is of type Method")
ElseIf MemberTypes.Property = myMemberTypes Then
Console.WriteLine("MemberType is of type Property")
ElseIf MemberTypes.TypeInfo = myMemberTypes Then
Console.WriteLine("MemberType is of type TypeInfo")
End If
Return
End Sub
End Class
下列示例使用所有反射 *Info
类和 BindingFlags 来列出指定类的全体成员(构造函数、字段、属性、事件和方法),并将成员区分为静态和实例类别。
// This program lists all the members of the
// System.IO.BufferedStream class.
using namespace System;
using namespace System::IO;
using namespace System::Reflection;
public ref class ListMembers
{
public:
static void Main()
{
// Specifies the class.
Type^ t = System::IO::BufferedStream::typeid;
Console::WriteLine("Listing all the members (public and non public) of the {0} type", t);
// Lists static fields first.
array<FieldInfo^>^ fi = t->GetFields(BindingFlags::Static |
BindingFlags::NonPublic | BindingFlags::Public);
Console::WriteLine("// Static Fields");
PrintMembers(fi);
// Static properties.
array<PropertyInfo^>^ pi = t->GetProperties(BindingFlags::Static |
BindingFlags::NonPublic | BindingFlags::Public);
Console::WriteLine("// Static Properties");
PrintMembers(pi);
// Static events.
array<EventInfo^>^ ei = t->GetEvents(BindingFlags::Static |
BindingFlags::NonPublic | BindingFlags::Public);
Console::WriteLine("// Static Events");
PrintMembers(ei);
// Static methods.
array<MethodInfo^>^ mi = t->GetMethods (BindingFlags::Static |
BindingFlags::NonPublic | BindingFlags::Public);
Console::WriteLine("// Static Methods");
PrintMembers(mi);
// Constructors.
array<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 properties.
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();
}
static void PrintMembers(array<MemberInfo^>^ ms)
{
for each (MemberInfo^ m in ms)
{
Console::WriteLine ("{0}{1}", " ", m);
}
Console::WriteLine();
}
};
int main()
{
ListMembers::Main();
}
// 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()
{
// 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 properties.
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();
}
}
' This program lists all the members of the
' System.IO.BufferedStream class.
Imports System.IO
Imports System.Reflection
Class ListMembers
Public Shared Sub Main()
' Specifies the class.
Dim t As Type = GetType(System.IO.BufferedStream)
Console.WriteLine("Listing all the members (public and non public) of the {0} type", t)
' Lists static fields first.
Dim fi As FieldInfo() = t.GetFields((BindingFlags.Static Or BindingFlags.NonPublic Or BindingFlags.Public))
Console.WriteLine("// Static Fields")
PrintMembers(fi)
' Static properties.
Dim pi As PropertyInfo() = t.GetProperties((BindingFlags.Static Or BindingFlags.NonPublic Or BindingFlags.Public))
Console.WriteLine("// Static Properties")
PrintMembers(pi)
' Static events.
Dim ei As EventInfo() = t.GetEvents((BindingFlags.Static Or BindingFlags.NonPublic Or BindingFlags.Public))
Console.WriteLine("// Static Events")
PrintMembers(ei)
' Static methods.
Dim mi As MethodInfo() = t.GetMethods((BindingFlags.Static Or BindingFlags.NonPublic Or BindingFlags.Public))
Console.WriteLine("// Static Methods")
PrintMembers(mi)
' Constructors.
Dim ci As ConstructorInfo() = t.GetConstructors((BindingFlags.Instance Or BindingFlags.NonPublic Or BindingFlags.Public))
Console.WriteLine("// Constructors")
PrintMembers(ci)
' Instance fields.
fi = t.GetFields((BindingFlags.Instance Or BindingFlags.NonPublic Or BindingFlags.Public))
Console.WriteLine("// Instance Fields")
PrintMembers(fi)
' Instance properties.
pi = t.GetProperties((BindingFlags.Instance Or BindingFlags.NonPublic Or BindingFlags.Public))
Console.WriteLine("// Instance Properties")
PrintMembers(pi)
' Instance events.
ei = t.GetEvents((BindingFlags.Instance Or BindingFlags.NonPublic Or BindingFlags.Public))
Console.WriteLine("// Instance Events")
PrintMembers(ei)
' Instance methods.
mi = t.GetMethods((BindingFlags.Instance Or BindingFlags.NonPublic Or BindingFlags.Public))
Console.WriteLine("// Instance Methods")
PrintMembers(mi)
Console.WriteLine(ControlChars.CrLf & "Press ENTER to exit.")
Console.Read()
End Sub
Public Shared Sub PrintMembers(ms() As MemberInfo)
Dim m As MemberInfo
For Each m In ms
Console.WriteLine("{0}{1}", " ", m)
Next m
Console.WriteLine()
End Sub
End Class