Visual C++ .NET/Reflection/Method

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

Get method from Type

<source lang="csharp">

  1. 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">

  1. 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">

  1. 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">

  1. 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>