Cómo: Enumerar tipos de datos en ensamblados mediante reflexión
Actualización: noviembre 2007
El código siguiente muestra la enumeración de tipos y miembros públicos mediante System.Reflection.
Dado el nombre de un ensamblado, ya sea en el directorio local o en la GAC, el código que sigue trata de abrir el ensamblado y recuperar descripciones. Si lo consigue, cada tipo se muestra con sus miembros públicos.
Observe que Assembly.Load requiere que no se utilice ninguna extensión de archivo. Por tanto, el uso de "mscorlib.dll" como argumento de la línea de comandos generará un error, mientras que el uso de "mscorlib" resultará en la presentación de los tipos de .NET Framework. Si no se proporciona ningún nombre de ensamblado, el código detectará y creará informes de los tipos incluidos en el ensamblado actual (el EXE que resulta de este código).
Ejemplo
// self_reflection.cpp
// compile with: /clr
using namespace System;
using namespace System::Reflection;
using namespace System::Collections;
public ref class ExampleType {
public:
ExampleType() {}
void Func() {}
};
int main() {
String^ delimStr = " ";
array<Char>^ delimiter = delimStr->ToCharArray( );
array<String^>^ args = Environment::CommandLine->Split( delimiter );
Assembly^ a = Assembly::LoadFrom("self_reflection.exe");
Console::WriteLine(a);
int count = 0;
array<Type^>^ types = a->GetTypes();
IEnumerator^ typeIter = types->GetEnumerator();
while ( typeIter->MoveNext() ) {
Type^ t = dynamic_cast<Type^>(typeIter->Current);
Console::WriteLine(" {0}", t->ToString());
array<MemberInfo^>^ members = t->GetMembers();
IEnumerator^ memberIter = members->GetEnumerator();
while ( memberIter->MoveNext() ) {
MemberInfo^ mi = dynamic_cast<MemberInfo^>(memberIter->Current);
Console::Write(" {0}", mi->ToString( ) );
if (mi->MemberType == MemberTypes::Constructor)
Console::Write(" (constructor)");
Console::WriteLine();
}
count++;
}
Console::WriteLine("{0} types found", count);
}