如何:使用反映以列舉組件中的資料類型 (C++/CLI)
下列程式碼會示範使用 System.Reflection 來列舉公用型別和成員。
指定組件 (組件在本機目錄或 GAC 中) 的名稱,則下列程式碼會嘗試開啟組件並擷取說明。 如果成功,則會顯示每個型別的公用成員。
請注意 Assembly.Load 要求不可使用副檔名。 因此,使用 "mscorlib.dll" 做為命令列引數會失敗,而只用 "mscorlib" 則可以顯示 .NET Framework 型別。 如果未提供組件名稱,則程式碼會偵測並回報目前組件 (這個程式碼所產生的 EXE) 中的型別。
範例
// 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);
}