我已经看到其他与此类似的问题,但是我似乎找不到适合我情况的解决方案。
我正在尝试添加一个类来处理方法调用并返回默认值 方法抛出异常时对象。
这是我得到的:
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;
}
}
我不确定我在做什么错。
答案 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);