Скажем, у меня есть следующие (упрощенно):neo4jclient гетерогенные данные вернуться
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; }
}
}
С помощью этой установки можно легко создать гетерогенную список оружия, брони и т.д., связанные с Актера. Но я не могу понять, как их вытащить. У меня есть этот метод (снова упрощенный), чтобы получить список всех связанных элементов, но он получает их все как элементы. Я не могу понять, как получить их как их фактический тип. Я могу использовать поле 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;
}
}
я нашел плохой обходной путь, где я вернусь тип и NodeID и запустить список с помощью оператор switch, который выполняет .Get с NodeID и передает его правильному типу. но это негибко и неэффективно. Я мог бы запускать один запрос для каждого производного класса и объединять их вместе, но мысль об этом заставляет меня сканировать кожу.
Это похоже на обычную проблему, но я ничего не нашел в Интернете. Есть идеи?
Это именно то, что я искал. Я знал, как работает сериализация, и почему у меня возникла проблема. Я просто не знал, как вернуть «сырые» данные, чтобы я мог свернуть свои собственные объекты. Большое вам спасибо за вашу помощь! –