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
}
}
请问如何在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)
共同基础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
}
}