2013-06-18 4 views
0

У меня есть простой статический метод, который не содержит параметров, возвращает что-либо или принимает какие-либо аргументы. Я бегу это так:Запуск статического метода с параметром out с использованием отражения

Assembly assembly = ResourceConfig.GetAssembly("IntegrationServices"); 
assembly.GetStaticMethod("Current.IntegrationServices.SomeIntegration.SomeMethod").Invoke(); 

который, кажется, работает нормально ...

Далее я есть статический метод, который возвращает один из параметров (это строка), и возвращает логическое значение. Я хочу запустить это, но не могу понять, что я делаю неправильно. Это то, что я до сих пор:

var objectArray = new object[1]; 
(bool)assembly.GetStaticMethod("Current.IntegrationServices.SomeIntegration.ReturningMethod").Invoke(objectArray) 

Из того, что я понял, я должен быть в состоянии получить доступ к objectArray [0] и получить свой выход значение .. но при попытке запустить этот код я получаю ошибку:

Method Current.IntegrationServices.SomeIntegration.ReturningMethod() cannot be found. 

И я уверяю вас, метод действительно существует ... :)

Вызов этого метода без отражения будет происходить так:

string s; 
bool value = Current.IntegrationServices.SomeIntegration.ReturningMethod(out s); 

Любые предложения о том, как запустить его с помощью метода GetStaticMethod и Invoke?

EDIT: Я только что нашел метод под названием GetStaticMethodWithArgs (это Assembly obj, string methodName, params Type [] list): MethodDelegate, как бы я это использовал?

EDIT 2: Теперь я смог запустить статический метод с аргументами, и это происходит так:

Assembly assembly = ResourceConfig.GetAssembly("IntegrationServices"); 
var staticMethodWithArgs = assembly.GetStaticMethodWithArgs("Current.IntegrationServices.SomeIntegration.ReturningMethod", typeof(string), typeof(string)); 
staticMethodWithArgs.Invoke(InputUsername.Text, InputPassword.Text) 

Еще косяк метода использования с параметром из ... предложений являются appriciated

+0

Вы должны вызвать '.Invoke (null, objectArray)' вместо '.Invoke (objectArray)'. – Steven

+0

Все еще говорит, что не может быть найден ... должен ли новый объект [1] иметь какую-то магию? –

+0

Вы видели этот связанный вопрос: http://stackoverflow.com/questions/2438065/c-sharp-reflection-how-can-i-invoke-a-method-with-an-out-parameter. – Steven

ответ

0

После долгих беспредела и тестирования я понял это .... Это все денди и хорошо, если я просто использовал соответствующий тип переменной ... Это должно было быть строка & .. Путь я получил это по линии:

methodInfo.GetParameters()[0].ParameterType.UnderlyingSystemType 

Далее, как я пытался это код выглядел следующим образом:

Assembly assembly = ResourceConfig.GetAssembly("IntegrationServices"); 
BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Static | BindingFlags.InvokeMethod; 
MethodInfo methodInfo = assembly.GetType("Current.IntegrationServices.SomeIntegration").GetMethod("GetAbaxUserToken", bindingFlags); 

var staticMethodWithArgs = assembly.GetStaticMethodWithArgs("Current.IntegrationServices.SomeIntegration.ReturningMethod", methodInfo.GetParameters()[0].ParameterType.UnderlyingSystemType); 

Который в свою очередь, привело меня вызвать MethodInfo и опускать Концепция GetStaticMethodWithArgs ... Если кто-то знает, как получить тип String & таким образом, без сбоев: typeof (String &) Я был бы увлекательным :)

0

Вам нужно работать с BindingFlags и, вероятно, это то, что вам не хватает. Посмотрите на эту ссылку MSDN. Чтобы продемонстрировать, следующий кодный блок отражает статический метод, который return bool и изменить аргумент out.

using System; 
    using System.Reflection; 
    namespace ConsoleApplication1 
    { 
     public class StaticInvoke 
     { 
      private static void Main() 
      { 
       MethodInfo info = typeof(StaticInvoke).GetMethod("SampleMethod", BindingFlags.Public | BindingFlags.Static); 
       var input = new object[] {"inputValue"}; 
       var value = info.Invoke(null, input); 
       Console.WriteLine(value); 
       Console.WriteLine(input[0]); 
       Console.ReadLine(); 
      } 

      public static bool SampleMethod(out string input) 
      { 
       input = "modified val"; 
       Console.WriteLine("I am executing"); 
       return true; 
      } 
     } 
    } 
+0

Спасибо за предложение .. но если вы прочтете комментарии, это не то, что я ищу ... Я хочу использовать функции GetStaticMethod или GetStaticMethodWithArgs ... . :) Это потому, что я хочу использовать объект сборки, который описан в вопросе ... –

Смежные вопросы