假设我有以下(简化):
public class Item
{
public String Name { get; set; }
public String Type { get; set; }
}
public class Armor : Item
{
public int AC { get; set; }
public Armor () { Type = "Armor"; }
}
public class Weapon : Item
{
public int Damage { get; set; }
public Armor () { Type = "Weapon"; }
}
public class Actor
{
...
}
public class HasItem : Relationship<ItemProps>, IRelationshipAllowingSourceNode<Actor>, IRelationshipAllowingTargetNode<Item>
{
public readonly string TypeKey = "HasItem";
public HasItem ( NodeReference targetItem, int count = 1 )
: base(targetItem, new ItemProps { Count = count })
{
}
public override string RelationshipTypeKey
{
get { return TypeKey; }
}
}
通过此设置,我可以轻松创建与 Actor 相关的武器、盔甲等异构列表。但我似乎无法弄清楚如何把它们弄出来。我有这个方法(再次简化)来获取所有相关项目的列表,但它将它们全部作为项目。我不知道如何让它们成为他们的实际类型。我可以使用 Type 字段来确定类型,但似乎没有动态构建返回:
public IEnumerable<Item> Items
{
get
{
return
GameNode
.GraphClient
.Cypher
.Start(new { a = Node.ByIndexLookup("node_auto_index", "Name", Name) })
.Match("(a)-[r:HasItem]-(i)")
.Return<Item>("i") // Need something here to return Armor, Weapon, etc as needed based on the Type property
.Results;
}
}
我发现了一个不好的解决方法,我返回 Type 和 NodeID 并通过 switch 语句运行列表,该语句使用 NodeID 执行 .Get 并将其转换为正确的类型。但这是不灵活和低效的。我可以为每个派生类运行一个查询并将它们连接在一起,但一想到这一点,我就感到毛骨悚然。
这似乎是一个常见的问题,但我在网上找不到任何东西。有任何想法吗?