Wyświetlanie informacji o typie
Klasa System.Type jest centralna do odbicia. Środowisko uruchomieniowe języka wspólnego tworzy Type
dla załadowanego typu podczas żądania odbicia. Możesz użyć Type
metod, pól, właściwości i klas zagnieżdżonych obiektu, aby dowiedzieć się więcej o tym typie.
Użyj Assembly.GetType polecenia lub Assembly.GetTypes , aby uzyskać Type
obiekty z zestawów, które nie zostały załadowane, przekazując nazwę żądanego typu lub typów. Użyj Type.GetType polecenia , aby pobrać Type
obiekty z zestawu, który jest już załadowany. Użyj Module.GetType poleceń i Module.GetTypes , aby uzyskać obiekty modułu Type
.
Uwaga
Jeśli chcesz zbadać i manipulować typami ogólnymi i metodami, zapoznaj się z dodatkowymi informacjami podanymi w Emocje ionie i typach ogólnych oraz Instrukcje: Badanie i tworzenie wystąpień typów ogólnych za pomocą Emocje ion.
Poniższy przykład przedstawia składnię niezbędną do pobrania obiektu i modułu Assembly dla zestawu.
// 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
W poniższym przykładzie pokazano pobieranie Type
obiektów z załadowanego zestawu.
// 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
Po uzyskaniu elementu Type
istnieje wiele sposobów odnajdywania informacji o elementach członkowskich tego typu. Na przykład możesz dowiedzieć się więcej o wszystkich elementach członkowskich typu, wywołując Type.GetMembers metodę , która uzyskuje tablicę MemberInfo obiektów opisujących każdy z elementów członkowskich bieżącego typu.
Można również użyć metod w Type
klasie, aby pobrać informacje o co najmniej jednym konstruktorze, metodach, zdarzeniach, polach lub właściwościach określonych według nazwy. Na przykład Type.GetConstructor hermetyzuje określony konstruktor bieżącej klasy.
Jeśli masz Type
właściwość , możesz użyć Type.Module właściwości , aby uzyskać obiekt, który hermetyzuje moduł zawierający ten typ. Użyj właściwości , Module.Assembly aby zlokalizować obiekt, który hermetyzuje zestaw zawierający moduł. Zestaw hermetyzujący typ można uzyskać bezpośrednio przy użyciu Type.Assembly właściwości .
System.Type i ConstructorInfo
W poniższym przykładzie pokazano, jak wyświetlić listę konstruktorów dla klasy , w tym przypadku klasę 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 i PropertyInfo
Uzyskaj informacje o metodach, właściwościach, zdarzeniach i polach typu przy użyciu MemberInfoobiektów , MethodInfo, FieldInfolub PropertyInfo .
W poniższym przykładzie użyto MemberInfo
metody , aby wyświetlić liczbę elementów członkowskich w System.IO.File
klasie i używa IsPublic właściwości w celu określenia widoczności klasy.
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
Poniższy przykład bada typ określonego elementu członkowskiego. Wykonuje odbicie względem składowej MemberInfo
klasy i wyświetla jej typ.
// 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
W poniższym przykładzie użyto wszystkich klas Emocje ion *Info
wraz z listą BindingFlags wszystkich elementów członkowskich (konstruktorów, pól, właściwości, zdarzeń i metod) określonej klasy, dzieląc składowych na kategorie statyczne i wystąpienia.
// 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