使用继承,泛型,接口的正确请求和响应模式c#

时间:2019-02-24 04:09:26

标签: c# generics inheritance interface

我有一个用于请求的接口和一个用于响应的接口。我想这样称呼

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

有人知道做这样的事情的正确方法,还是至少让我知道如何让我的课程作为参数工作?

2 个答案:

答案 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);
    }
}