Параметр типа Dotnet core genric унаследованный режим

#c# #oop #inheritance #.net-core

#c# #ООП #наследование #.net-ядро

Вопрос:

Я хотел бы спросить, как я могу получить такую подпись в dotnet? У меня есть эти три метода

 public IEnumerablelt;Positiongt; GetOpenPositions(IEnumerablelt;AllianceOpenPositiongt; allianceOpenPositions, uint allianceId, IEnumerablelt;agile_shared.RequestModel.OpenPositiongt; orgOpenPositionList) public IEnumerablelt;Positiongt; GetOpenPositions(IEnumerablelt;SquadOpenPositiongt; squadOpenPositions, uint squadId, IEnumerablelt;agile_shared.RequestModel.OpenPositiongt; orgOpenPositionList) public IEnumerablelt;Positiongt; GetOpenPositions(IEnumerablelt;TribeOpenPositiongt; tribeOpenPosition, uint tribeId, IEnumerablelt;agile_shared.RequestModel.OpenPositiongt; orgOpenPositionList)  

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

Я хотел бы создать интерфейс, чтобы ограничить объект для реализации метода GetOpenPositions.

Я попытался создать что-то подобное

 public IEnumerablelt;Positiongt; GetOpenPositions(IEnumerablelt;OpenPositionBasegt; tribeOpenPosition, uint tribeId, IEnumerablelt;agile_shared.RequestModel.OpenPositiongt; orgOpenPositionList)  

Общий базовый класс

 public class OpenPositionBase  {  public uint OpenPositionId { get; set; }  }  

Позиция альянса

 public class AllianceOpenPosition : OpenPositionBase  {  public AllianceOpenPosition()  {  Alliance = new Alliance();  LeadRole = new LeadRole();  }   public uint Id { get; set; }   public uint AllianceId { get; set; }   public uint LeadRoleId { get; set; }  }  

Этот класс является реализацией интерфейса IPositionConverter, в котором я ищу, чтобы добавить метод GetOpenPositions в общем виде, поэтому в классе SquadPositionConverter я мог бы использовать этот метод как GetOpenPositions(IEnumerablelt;SquadOpenPositiongt; allianceOpenPositions, uint allianceId, IEnumerablelt;agile_shared.RequestModel.OpenPositiongt; orgOpenPositionList)

 public class AlliancePositionConverter : IPositionConverter  {   public IEnumerablelt;Positiongt; GetOpenPositions(IEnumerablelt;AllianceOpenPositiongt; allianceOpenPositions, uint allianceId, IEnumerablelt;agile_shared.RequestModel.OpenPositiongt; orgOpenPositionList)  {  return allianceOpenPositions.Where(w =gt; w.AllianceId == allianceId)  .Select(s =gt; new Position(orgOpenPositionList.FirstOrDefault(wh =gt; wh.Id == s.OpenPositionId))  {  Id = s.Id.ToString(),  AgileRole = s.LeadRole.Name,  AgileRoleRank=s.LeadRole.Rank  }).ToList();  }  

и все остальные классы имеют аналогичную структуру.

и затем измените в каждом объекте параметр на унаследованную модель. К сожалению, это дает и ошибку.

Какое — либо возможное решение, кроме создания всех трех и реализации только одного необходимого?

Комментарии:

1. Какое сообщение об ошибке оно вам выдает? Также было бы неплохо посмотреть, для чего вы написали OpenPositionBase

2. Сообщение об ошибке в этом случае заключается в том, что объект не реализует интерфейс.

3. В этом вопросе отсутствуют некоторые довольно важные детали. Можете ли вы вставить конкретные классы, базовый класс/интерфейс и объяснить, что делает этот метод и какие сходства есть у классов.

4. Спасибо за комментарий. Обновлено описание

Ответ №1:

не совсем уверен, чего именно ты добиваешься, но:

Вы можете сделать сам метод универсальным:

 public IEnumerablelt;Positiongt; GetOpenPoslt;Tgt;(IEnumerablelt;Tgt; list, uint tribeId, IEnumerablelt;agile_shared.RequestModel.OpenPositiongt; orgOpenPositionList) where T : OpenPositionBase  

Затем вы можете работать со своим списком, как если бы это была база открытых позиций

или вы можете создать универсальный интерфейс:

 public interface IGetOpenPoslt;Tgt; where T : OpenPositionBase {  public IEnumerablelt;Positiongt; GetOpenPos(IEnumerablelt;Tgt; list, uint tribeId, IEnumerablelt;agile_shared.RequestModel.OpenPositiongt; orgOpenPositionList); }  public class AlianceOpenPosition : OpenPositionBase, IGetOpenPoslt;AlianceOpenPositiongt; {  public IEnumerablelt;Positiongt; GetOpenPos(IEnumerablelt;AlianceOpenPositiongt; list, uint tribeId, IEnumerablelt;agile_shared.RequestModel.OpenPositiongt; orgOpenPositionList)  {  // implement  } }