Ver información de tipo
La clase System.Type es fundamental para la reflexión. Common Language Runtime crea el Type
para un tipo cargado cuando la reflexión la solicita. Puede usar los métodos, campos, propiedades y clases anidadas de un objeto Type
para averiguar todo sobre ese tipo.
Use Assembly.GetType o Assembly.GetTypes para obtener Type
objetos de ensamblados que no se han cargado, pasando el nombre del tipo o los tipos que desee. Use Type.GetType para obtener los objetos Type
de un ensamblado que ya está cargado. Use Module.GetType y Module.GetTypes para obtener objetos Type
de módulo.
Nota:
Si quiere examinar y manipular tipos y métodos genéricos, vea la información adicional proporcionada en Reflexión y tipos genéricos y Cómo: Examinar y crear instancias de tipos genéricos mediante la reflexión.
En el ejemplo siguiente se muestra la sintaxis necesaria para obtener el objeto Assembly y el módulo de un ensamblado.
// 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
En el ejemplo siguiente se muestra cómo obtener Type
objetos de un ensamblado cargado.
// 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
Una vez que obtenga un Type
, hay muchas maneras de descubrir información sobre los miembros de ese tipo. Por ejemplo, puede obtener información sobre todos los miembros del tipo. Para ello, llame al método Type.GetMembers, que obtiene una matriz de objetos MemberInfo que describen cada uno de los miembros del tipo actual.
También puede usar métodos en la clase Type
para recuperar información sobre uno o varios constructores, métodos, eventos, campos o propiedades que especifique por nombre. Por ejemplo, Type.GetConstructor encapsula un constructor específico de la clase actual.
Si tiene un Type
, puede usar la propiedad Type.Module para obtener un objeto que encapsula el módulo que contiene ese tipo. Use la propiedad Module.Assembly para buscar un objeto que encapsule el ensamblado que contiene el módulo. Puede obtener el ensamblado que encapsula el tipo directamente mediante la propiedad Type.Assembly.
System.Type y ConstructorInfo
En el ejemplo siguiente se muestra cómo enumerar los constructores de una clase, en este caso, la clase 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 y PropertyInfo
Obtenga información sobre los métodos, las propiedades, los eventos y los campos del tipo mediante los objetos MemberInfo, MethodInfo, FieldInfo o PropertyInfo.
En el ejemplo siguiente se usa MemberInfo
para enumerar el número de miembros de la clase System.IO.File
y se usa la propiedad IsPublic para determinar la visibilidad de la clase.
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
En el ejemplo siguiente se investiga el tipo del miembro especificado. Realiza la reflexión en un miembro de la clase MemberInfo
y enumera su tipo.
// 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
En el ejemplo siguiente se usan todas las clases de reflexión *Info
junto con BindingFlags para enumerar todos los miembros (constructores, campos, propiedades, eventos y métodos) de la clase especificada, dividiendo los miembros en categorías estáticas e de instancia.
// 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