MethodInfo.Invoke возвращает объект, не соответствующий целевому типу - PullRequest
0 голосов
/ 17 ноября 2018

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

Я пытаюсь добавить класс для обработки вызовов метода и вернуть объект по умолчанию, если метод выдаетисключение.

Вот что я получил:

public class ServerConnection<T>
{

    public T2 ExecuteMethod<T2>(string methodName, T2 defaultReturnValue, params object[] p)
    {
        var result = defaultReturnValue;
        try
        {
            var baseClass = typeof(T);

            var theMethod = baseClass.GetMethod(methodName);


//next line throws error       
     result = (T2)theMethod?.Invoke(baseClass, p);

        }
        catch (Exception ex)
        {
            //shows Error "object does not match target type"
            MessageBox.Show(ex.Message);
        }

        return result;
    }

}

Я не уверен, что я делаю здесь неправильно.

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Это то, что сработало, если кому-то интересно.

public class ServerConnection
{
    public TReturn Result<TReturn, TChannel>([CanBeNull] TReturn defaultReturn, TChannel clientChannel, [CanBeNull] params object[] p)
    {
      //ignore these 3 lines if your just want the method by name
        var stackTrace = new StackTrace();
        var callerMethod = stackTrace.GetFrame(1).GetMethod();
        var methodName = callerMethod.Name;


        var result = defaultReturn;
        try
        {
            var channelType = typeof(TChannel);
            var theMethod = channelType.GetMethod(methodName);
            var client = (IClientChannel)clientChannel;
            result = (TReturn)theMethod?.Invoke(client, p);
            client.Close();
        }
        catch (Exception e)
        {

            MessageBox.Show("There was an error processing your request\n\nAny data received may be Inaccurate");
            //Ignored
        }
        return result;
    }
}

и вот пример того, как он используется

        public UserDto GetUserById (Guid id)
        => Server.Result(new UserDto(), CreateChannel() ,id);
0 голосов
/ 17 ноября 2018

Проблема в следующей строке:

result = (T2)theMethod?.Invoke(baseClass, p);

Вы пытаетесь вызвать метод базового класса 'type.Предполагается, что первым аргументом будет объект, для которого вы вызываете метод.Этот метод не существует в Type, он существует в базовом классе T2!

Чтобы это работало, сначала необходимо создать экземпляр целевого типа. Предполагая, что тип имеет конструктор по умолчанию , вы можете использовать

var instance = Activator.CreateInstance(baseClass);

Затем вызвать его:

theMethod?.Invoke(instance, p);

Обратите внимание, что я удалил приведение (T2).У вас есть экземпляр базового класса.Вы не можете назначить экземпляр базового класса подтипу.Этот акт не действителен.Тем не менее, возможно, вы хотели создать экземпляр T2 вместо базового класса?Если это так, просто измените код выше соответственно:

var instance = Activator.CreateInstance(typeof(T2));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...