【问题标题】:Dotnet core genric type parameter inherited modedotnet core 泛型类型参数继承方式
【发布时间】:2022-01-09 09:42:42
【问题描述】:

我想问如何在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的基本抽象类下@

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

我尝试过创建类似的东西

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

通用基类

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

AllianceOpenPosition

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(IEnumerable&lt;SquadOpenPosition&gt; allianceOpenPositions, uint allianceId, IEnumerable&lt;agile_shared.RequestModel.OpenPosition&gt; 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();
        }

所有其余的类都有类似的结构。

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

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

【问题讨论】:

  • 它给你什么错误信息?看看你为OpenPositionBase写的东西也很好
  • 这种情况的错误信息是对象没有实现接口。
  • 这个问题缺少一些相当关键的细节。您能否粘贴具体类、基类/接口并解释此方法的作用以及这些类的相似之处。
  • 感谢您的评论。更新了描述

标签: c# oop inheritance .net-core


【解决方案1】:

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

您可以将方法本身设为通用:

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

【讨论】:

    猜你喜欢
    • 2015-11-18
    • 2012-11-29
    • 2018-09-27
    • 2015-09-15
    • 1970-01-01
    • 2021-10-11
    • 2018-08-01
    • 1970-01-01
    相关资源
    最近更新 更多