我想問一下我如何在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; }
}
聯盟開倉
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<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();
}
其余的所有類都具有類似的結構。
然后將每個物件的引數更改為繼承的模型。不幸的是它給出了錯誤。
除了創建所有三個并僅實作所需的一個之外,還有其他可能的解決方案嗎?
uj5u.com熱心網友回復:
不太確定你到底在追求什么,但是:
您可以使方法本身通用:
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
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/372366.html
