我正在使用第三方网络服务,其所有方法都具有以下签名:
SomeResponseClass SomeMethod(SomeRequestClass request)
每个方法都有自己的请求类和响应类,但是所有请求和所有响应都有一些共同点。
每个请求类都有几个用于识别的属性:username
and token
,每个响应类都有几个属性来指示是否存在错误:status
and error
.
我正在寻找一种优雅的方法来创建一个实例化我的请求的方法 - 这样我就不必在调用服务的每个方法中重复自己。由于我无法更改这些类,并且所有类都没有通用的接口或基类,因此我找到的唯一解决方案是使用dynamic
:
private T CreateRequest<T>() where T : new()
{
if(string.IsNullOrEmpty(_Token))
{
Login();
}
// this has to be dynamic for the next 2 rows to pass compilation.
dynamic request = new T();
request.username = _UserName;
request.token = _Token;
return (T)request;
}
类似于从服务响应中填充我自己的实体:
// response have to be dynamic for getting the error and status properties
private static T CreateServiceResponse<T>(dynamic response) where T : ServiceResponse, new()
{
T result = new T();
result.Error = (response == null) ? "Service response is null" : response.error;
result.Status = (response == null) ? -1 : response.status;
return result;
}
(此方法在我用来填充实体的每个方法中使用(全部源自ServiceResponse
)以及来自服务响应的数据。)
有没有办法在不使用的情况下做这样的事情dynamic
?
对我来说,这有点像使用肮脏的黑客......
如果我能以某种方式“注入”一个用于所有要实现的请求的通用接口和一个用于所有要实现的响应的通用接口,我可以使用简单的泛型,但我想这是不可能的,或者是吗?