Попытка использовать метод Reflection to Invoke в том же классе - PullRequest
1 голос
/ 08 июля 2010

У меня есть служба WCF, которая принимает объект в качестве параметра, который имеет URI и имя метода.То, что я пытаюсь сделать, это иметь метод, который будет выглядеть @ URI, если он содержит слова "localhost", он будет использовать отражение и вызовет метод, имя которого передается в качестве параметра, в том же классе, верните значение и продолжайте.

public class Test
{
     public GetStatResponse GetStat(GetStatRequest request)
     {

        GetStatResponse returnValue = new GetStatResponse();

         if(Helpers.Contains(request.ServiceURI,"localhost", StringComparison.OrdinalIgnoreCase))
         {
             MethodInfo mi = this.GetType().GetMethod(request.ServiceMethod /*, BindingFlags.Public | BindingFlags.IgnoreCase*/);
             returnValue = (GetStatResponse)mi.Invoke(this,null);
         }

Выше приведен сегмент кода, относящийся к этому вопросу.Я вытащил MethodInfo без проблем, но я сталкиваюсь с проблемами на mi.Invoke.Исключением, которое я получаю, является «Исключение было сгенерировано целью вызова».С Внутренним Исключением "Ссылка на объект не установлена ​​на экземпляр объекта".Я попытался изменить код (GetStatResponse) mi.Invoke (новый Test (), NULL), но безуспешно.Проверьте себя в классе.

Я открыт для других предложений относительно того, как решить эту проблему, я просто подумал, что отражение может быть самым простым.

Метод, который я вызываю при тестировании, определяется как

public GetStatResponse TestMethod() 
{
         GetStatResponse returnValue = new GetStatResponse(); 
         Stat stat = new Stat();
         Stat.Label = "This is my label";
         Stat.ToolTip = "This is my tooltip";
         Stat.Value = "this is my value"; 

         returnValue.Stat = stat;
         return returnValue;
}

Ответы [ 2 ]

0 голосов
/ 08 июля 2010

Поскольку вы не указываете BindingFlags в своем вызове GetMethod (), вам будут возвращаться только методы, соответствующие имени, содержащему request.ServiceMethod, которые являются ОБЩЕСТВЕННЫМИ.

Проверьте, вызывается ли метод, который вы пытаетесь вызватьявляется общедоступным, в противном случае MethodInfo вернет значение null.

Если он не является общедоступным, либо сделайте метод общедоступным, либо включите флаг BindingFlags.NonPublic.

Кроме того, вы всегда должны убедиться, что mi!= null перед вызовом mi.Invoke

0 голосов
/ 08 июля 2010

Перед вызовом метода вы можете убедиться, что MethodInfo , который вы проходите через отражение, не равен нулю:

MethodInfo mi = this.GetType().GetMethod(
    request.ServiceMethod, 
    BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase
);

// Make sure that the method exists before trying to call it
if (mi != null)
{
    returnValue = (GetStatResponse)mi.Invoke(this, null);
}

После вашего обновления кажется, чтоисключение выдается внутри метода, который вы вызываете:

GetStatResponse returnValue = new GetStatResponse(); 
// Don't forget to initialize returnValue.Stat before using it:
returnValue.Stat = new WhateverTheTypeIs();
returnValue.Stat.Label = "This is my label";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...