Правильный шаблон запроса и ответа с использованием наследования, обобщений, интерфейсов c # - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть интерфейс для запросов и интерфейс для ответов.Я хочу вызвать что-то вроде этого

        public IResponse Get(IRequest req)

Объект запроса сериализуется и отправляется по шине.

Я получаю ответ обратно, но мне нужно десериализовать ответ в класс IResponseэто соответствует конкретному классу IRequest.Как правильно связать ответ с запросом, чтобы каждый раз, когда кто-то реализовывал одну из этих пар запрос / ответ, ему приходилось ограничивать ее определенным типом?

Вот что я пробовал:

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: не могу преобразоватьот 'Req' до 'IRequest <(IResponse)>'

Кто-нибудь знает правильный способ сделать что-то подобное или, по крайней мере, дайте мне знать, как заставить мой класс работать в качестве параметра?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Что касается подписи, я бы использовал то, что предлагает Павел:

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);
    }
}
0 голосов
/ 24 февраля 2019

Вы можете построить свой метод так:

public IResponse Get<T>(IRequest<T> req) where T : IResponse 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...