我們想將 aList<Rule>中我們知道它們都派生自的地方BuildingRule<T>轉換為BuildingRule<T>,但型別 T 可以不同。
我們基本上想做
_buildingRules.Find(x => ((BuildingRule<T>)x).GetBuilding(sku, upgradeId) != null)
(`.GetBuilding() != null 是規則必須滿足的要求,才能使其成為正確的規則)。
雖然這不起作用,但我們想知道是否有辦法實作我們正在嘗試做的事情。
public abstract class Rule
{
[XmlIgnore]
public abstract string FileName { get; }
}
public abstract class BuildingRule<T> : Rule where T : BuildingDefinitionRule
{
[XmlElement("Definition")]
public virtual List<T> Definitions { get; set; }
public virtual T GetBuilding(string sku, int upgradeId = 0)
{
return Definitions.Find(x => x.Sku == sku && x.UpgradeId == upgradeId);
}
}
public abstract class BuildingRule : BuildingRule<BuildingDefinitionRule>
{
}```
uj5u.com熱心網友回復:
您可以創建非通用BuildingRuleBase:
public abstract class BuildingRuleBase : Rule
{
public abstract BuildingDefinitionRule GetBuilding(string sku, int upgradeId = 0);
}
并繼承它:
public abstract class BuildingRule<T> : BuildingRuleBase where T : BuildingDefinitionRule
{
public override T GetBuilding(string sku, int upgradeId = 0)
{
return Definitions.Find(x => true);
}
}
并_buildingRules收集BuildingRuleBase.
或者考慮使用協變通用介面:
public interface IBuildingRule<out T> where T : BuildingDefinitionRule
{
T GetBuilding(string sku, int upgradeId = 0);
}
public abstract class BuildingRule<T> : Rule, IBuildingRule<T> where T : BuildingDefinitionRule
{
[XmlElement("Definition")]
public virtual List<T> Definitions { get; set; }
public T GetBuilding(string sku, int upgradeId = 0)
{
return Definitions.Find(x =>true);
}
}
與new List<IBuildingRule<BuildingDefinitionRule>>()for 型別_buildingRules。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/378974.html
