Condividi tramite


Procedura: enumerare tipi di dati negli assembly tramite reflection

Aggiornamento: novembre 2007

Nell'esempio di codice riportato di seguito viene illustrata l'enumerazione dei membri e dei tipi pubblici mediante System.Reflection.

Dato il nome di un assembly, archiviato nella directory locale o nella Global Assembly Cache, si tenterà di aprire l'assembly e di recuperare le descrizioni. Se l'operazione riesce, verrà visualizzato ciascun tipo con i relativi membri pubblici.

Tenere presente che Assembly.Load richiede che non venga utilizzata alcuna estensione di file. Di conseguenza, se come argomento della riga di comando si utilizza "mscorlib.dll" verrà generato un errore, mentre se si utilizza semplicemente "mscorlib" verranno visualizzati i tipi di .NET Framework. Se non viene fornito alcun nome di assembly, verranno rilevati e indicati i tipi definiti all'interno dell'assembly corrente (il file exe risultante da questo codice).

Esempio

// 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);
}

Vedere anche

Riferimenti

Reflection in C++