Используйте интерфейсы для применения общих правил к унаследованным интерфейсам - PullRequest
2 голосов
/ 13 февраля 2020

У меня есть несколько моделей с одинаковыми именами в разных пространствах имен, таких как:

A.Request
A.Response
B.Request
B.Response

et c

И у меня есть интерфейсы с общей подписью:

interface IA : Common
{
  A.Response Do(A.Request);
}

interface IB : Common
{
  B.Response Do(B.Request);
}

и я хочу создать общий интерфейс, которого будут придерживаться все интерфейсы:

interface ICommon
{
  Response Do(Request);
}

Но, похоже, это не сработает, потому что он всегда будет пытаться дублировать методы, а не применять правила к Унаследованный интерфейс.

Я пытался использовать dynamic или object

interface ICommon
{
  dynamic Do(dynamic);
}

и даже пытался создать общий интерфейс для таких моделей, как:

A.Request : IRequest
A.Response : IResponse
B.Request : IRequest
B.Response : IResponse

interface ICommon
{
  IResponse request Do(IRequest);
}

Но, похоже, ничего не работает.

Все, что я хочу - это иметь эти интерфейсы с одинаковой сигнатурой, реализуя один и тот же метод, но с моделями другого пространства имен, и я не могу найти способ сделать это. Возможно, интерфейсы не предназначены для наложения общих правил на унаследованные интерфейсы, поэтому я хочу найти способ сделать это.

Я хочу избегать использования обобщений, потому что уже пробовал это, и это не работает, потому что модели запечатаны, и вы не можете иметь правило where IRequest: A.Request.

interface ICommon
{
  Tresponse Do<TRequest,TResponse>(TRequest);
}

interface IA
{
 A.Response Do<TRequest,TResponse>(A.Request) where TRequest: A.Request, TResponse: B.Response; <- not allowed
}

1 Ответ

0 голосов
/ 13 февраля 2020

Хотелось бы что-то вроде следующей работы для вас?

class ARequest: IRequest {
}

class AResponse: IResponse {
}

interface IRequest {
}

interface IResponse {
}

interface ICommon<TRequest, TResponse> where TRequest: IRequest where TResponse: IResponse
{
  TResponse Do(TRequest request);
}

interface IA: ICommon<ARequest, AResponse>
{
   AResponse Do(ARequest r);
}

Или это

interface IA: ICommon<IRequest, IResponse>
{
   AResponse Do<IRequest, IResponse>(ARequest r)
       where IRequest: ARequest 
       where IResponse: AResponse;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...