Visual C++ .NET/Reflection/Method
Содержание
Get method from Type
<source lang="csharp">
- include "stdafx.h"
using namespace System; using namespace System::Reflection; ref class Reflector {
public: void TestDynamicCall(String^ greeting) { Console::WriteLine(greeting); }
}; void LoadAndReflect(String^ assemblyFileName, String^ typeName,String^ methodName, array<Object^>^ parameterList) {
Assembly^ assembly = Assembly::LoadFrom(assemblyFileName); Type^ t= assembly->GetType(typeName); MethodInfo^ method = t->GetMethod(methodName); Object^ obj = Activator::CreateInstance(t); method->Invoke(obj, parameterList);
} int main() {
array<Object^>^ params = gcnew array<Object^> { "Hello!" }; LoadAndReflect("reflection2.exe", "Reflector", "TestDynamicCall", params);
}
</source>
Invoke a method
<source lang="csharp">
- include "stdafx.h"
using namespace System; using namespace System::Reflection; ref class Reflector {
public: void TestDynamicCall(String^ greeting) { Console::WriteLine(greeting); }
}; void LoadAndReflect(String^ assemblyFileName, String^ typeName,String^ methodName, array<Object^>^ parameterList) {
Assembly^ assembly = Assembly::LoadFrom(assemblyFileName); Type^ t= assembly->GetType(typeName); MethodInfo^ method = t->GetMethod(methodName); Object^ obj = Activator::CreateInstance(t); method->Invoke(obj, parameterList);
} int main() {
array<Object^>^ params = gcnew array<Object^> { "Hello!" }; LoadAndReflect("reflection2.exe", "Reflector", "TestDynamicCall", params);
}
</source>
Using reflection to get the method return type
<source lang="csharp">
- include "stdafx.h"
using namespace System; using namespace System::Reflection; ref class Reflector {
public: void LoadAndReflect(String^ assemblyFileName) { Assembly^ assembly = Assembly::LoadFrom(assemblyFileName); array<Type^>^ types = assembly->GetTypes(); for each (Type^ t in types) { Console::WriteLine(t->ToString()); array<MethodInfo^>^ methods = t->GetMethods(); for each (MethodInfo^ method in methods) { Console::Write(" {0} {1}(", method->ReturnType->ToString(),method->Name); array<ParameterInfo^>^ params = method->GetParameters(); for (int i = 0; i < params->Length; i++) { ParameterInfo^ param = params[i]; Console::Write("{0} {1}", param->ParameterType->ToString(), param->Name); if (i < params->Length - 1) Console::Write(", "); } Console::WriteLine(")"); } } }
}; int main(array<String^>^ args) {
Reflector^ r = gcnew Reflector(); for each (String^ s in args) { Console::WriteLine("Reflection on {0}", s); r->LoadAndReflect(s); }
}
</source>
Using reflection to get the parameter info of a method
<source lang="csharp">
- include "stdafx.h"
using namespace System; using namespace System::Reflection; ref class Reflector {
public: void LoadAndReflect(String^ assemblyFileName) { Assembly^ assembly = Assembly::LoadFrom(assemblyFileName); array<Type^>^ types = assembly->GetTypes(); for each (Type^ t in types) { Console::WriteLine(t->ToString()); array<MethodInfo^>^ methods = t->GetMethods(); for each (MethodInfo^ method in methods) { Console::Write(" {0} {1}(", method->ReturnType->ToString(),method->Name); array<ParameterInfo^>^ params = method->GetParameters(); for (int i = 0; i < params->Length; i++) { ParameterInfo^ param = params[i]; Console::Write("{0} {1}", param->ParameterType->ToString(), param->Name); if (i < params->Length - 1) Console::Write(", "); } Console::WriteLine(")"); } } }
}; int main(array<String^>^ args) {
Reflector^ r = gcnew Reflector(); for each (String^ s in args) { Console::WriteLine("Reflection on {0}", s); r->LoadAndReflect(s); }
}
</source>