dotnet core泛型类型参数继承方式

Dotnet core genric type parameter inherited mode

请问如何在dotnet中实现这样的签名? 我有这三种方法

public IEnumerable<Position> GetOpenPositions(IEnumerable<AllianceOpenPosition> allianceOpenPositions, uint allianceId, IEnumerable<agile_shared.RequestModel.OpenPosition> orgOpenPositionList)
public IEnumerable<Position> GetOpenPositions(IEnumerable<SquadOpenPosition> squadOpenPositions, uint squadId, IEnumerable<agile_shared.RequestModel.OpenPosition> orgOpenPositionList)
public IEnumerable<Position> GetOpenPositions(IEnumerable<TribeOpenPosition> tribeOpenPosition, uint tribeId, IEnumerable<agile_shared.RequestModel.OpenPosition> orgOpenPositionList)

如您所见,签名之间的唯一区别是作为输入接收的列表类型。所有三个模型都统一在一个名为 OpenPositionBase

的基础抽象 class 下

我想创建一个接口来限制对象实现 GetOpenPositions 方法。

我试过创建这样的东西

public IEnumerable<Position> GetOpenPositions(IEnumerable<OpenPositionBase> tribeOpenPosition, uint tribeId, IEnumerable<agile_shared.RequestModel.OpenPosition> orgOpenPositionList)

共同基础class

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; }
    }

此 class 是 IPositionConverter 接口的实现,我希望在其中以通用方式添加 GetOpenPositions 方法,因此在 SquadPositionConverter class 中我可以将此方法用作 GetOpenPositions(IEnumerable<SquadOpenPosition> allianceOpenPositions, uint allianceId, IEnumerable<agile_shared.RequestModel.OpenPosition> orgOpenPositionList)

public class AlliancePositionConverter : IPositionConverter
    {

        public IEnumerable<Position> GetOpenPositions(IEnumerable<AllianceOpenPosition> allianceOpenPositions, uint allianceId, IEnumerable<agile_shared.RequestModel.OpenPosition> orgOpenPositionList)
        {
            return allianceOpenPositions.Where(w => w.AllianceId == allianceId)
                                        .Select(s => new Position(orgOpenPositionList.FirstOrDefault(wh => wh.Id == s.OpenPositionId))
                                        {
                                            Id = s.Id.ToString(),
                                            AgileRole = s.LeadRole.Name,
                                            AgileRoleRank=s.LeadRole.Rank
                                        }).ToList();
        }

和所有其他 classes 具有相似的结构。

然后在每个对象中将参数更改为继承模型。不幸的是它给出了错误。

除了创建所有三个并仅实施所需的一个之外,还有其他可能的解决方案吗?

不太确定你到底在追求什么但是:

您可以使方法本身通用:

public IEnumerable<Position> GetOpenPos<T>(IEnumerable<T> list, uint tribeId, IEnumerable<agile_shared.RequestModel.OpenPosition> orgOpenPositionList) where T : OpenPositionBase

然后您就可以像处理未平仓头寸一样处理您的列表

或者您可以创建一个通用接口:

public interface IGetOpenPos<T> where T : OpenPositionBase
{
    public IEnumerable<Position> GetOpenPos(IEnumerable<T> list, uint tribeId, IEnumerable<agile_shared.RequestModel.OpenPosition> orgOpenPositionList);
}

public class AlianceOpenPosition : OpenPositionBase, IGetOpenPos<AlianceOpenPosition>
{
    public IEnumerable<Position> GetOpenPos(IEnumerable<AlianceOpenPosition> list, uint tribeId, IEnumerable<agile_shared.RequestModel.OpenPosition> orgOpenPositionList)
    {
        // implement
    }
}