Comment : énumérer des types de données dans des assemblys à l'aide de réflexion (C++/CLI)
Le code suivant illustre l'énumération de types et de membres publics à l'aide de System.Reflection.
Une fois le nom d'un assembly spécifié, dans le répertoire local ou dans le GAC, le code suivant essaie d'ouvrir l'assembly et de récupérer des descriptions. En cas de réussite, chaque type est affiché avec ses membres publics.
Notez que Assembly.Load exige qu'aucune extension de fichier ne soit utilisée. Par conséquent, l'utilisation de "mscorlib.dll" comme argument de ligne de commande échouera, alors que l'utilisation de "mscorlib" uniquement entraînera l'affichage des types .NET Framework. Si aucun nom d'assembly n'est fourni, ce code détecte et signale les types contenus dans l'assembly actuel (fichier EXE résultant de ce code).
Exemple
// 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 );
// replace "self_reflection.exe" with an assembly from either the local
// directory or the GAC
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);
}