我有一个用于请求的接口和一个用于响应的接口。我想这样称呼
public IResponse Get(IRequest req)
请求对象被序列化并通过总线发送出去。
我得到了一个响应,但是我需要将该响应反序列化为与特定IRequest类相对应的IResponse类。将响应绑定到请求的正确方法是什么,以便每当有人实现这些请求/响应对之一时,他们都必须将其约束为某种类型?
这是我尝试过的:
public interface IRequest<T> where T : IResponse
{
Type GetResponseType(T t);
}
public interface IResponse { }
public class Res : IResponse
{
public string response { get; set; }
}
public class Req : IRequest<Res>
{
public string request { get; set; }
public Type GetResponseType(Res t)
{
return t.GetType();
}
}
问题是,我现在不知道如何传递IRequest:
public IResponse Get(IRequest req)
我得到了错误:
使用通用类型“ IRequest”需要1个类型参数
我尝试过:
public IResponse Get(IRequest<IResponse> req)
但是当我尝试通过我的课程时,我得到了:
参数1:无法从“要求”转换为“ IRequest <(IResponse)>”
有人知道做这样的事情的正确方法,还是至少让我知道如何让我的课程作为参数工作?
答案 0 :(得分:3)
您可以这样构造您的方法:
public IResponse Get<T>(IRequest<T> req) where T : IResponse
答案 1 :(得分:0)
关于签名,我会使用Pawel的建议:
public IResponse Get<T>(IRequest<T> req) where T : IResponse
关于实现-您是否真的需要GetResponseType)方法的参数?我问,因为好像GetResponseType绑定到泛型T,并且可以始终从中推断出来。下面的代码说明了我要提出的观点。
public interface IRequest<T> where T : IResponse
{
Type GetResponseType();
}
public interface IResponse { }
public class Res : IResponse
{
public string response { get; set; }
}
public class Req : IRequest<Res>
{
public string request { get; set; }
public Type GetResponseType()
{
return typeof(Res);
}
}