MethodInfo.Invoke返回对象与目标类型不匹配

时间:2018-11-16 21:22:37

标签: c# wcf reflection

我已经看到其他与此类似的问题,但是我似乎找不到适合我情况的解决方案。

我正在尝试添加一个类来处理方法调用并返回默认值 方法抛出异常时对象。

这是我得到的:

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 :(得分:1)

问题是这一行:

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));

答案 1 :(得分:0)

如果有人感兴趣的话,这就是最终的结果。

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);