Вы, вероятно, видите:
Тип может участвовать только в одной иерархии наследования
на данный момент, верно?
Проблемастановится понятнее, если вспомнить, что ResourceNode<T>
не является закрытым типом, но ResourceNode<Ship>
и ResourceNode<SomeType>
равны .Это означает 2 вещи:
Во-первых, Node
нужно знать отдельно о двух (ResourceNode<Ship>
и ResourceNode<SomeType>
), а во-вторых: нам нужно рассказать ResourceNode<Ship>
о ShipResource
только и ResourceNode<SomeType>
о SomeResource
только .
Первое достаточно просто с использованием атрибутов:
[ProtoContract]
[ProtoInclude(1, typeof(SomeNodeType)), ProtoInclude(2, typeof(SomeOtherType))]
[ProtoInclude(3, typeof(ResourceNode<Ship>))]
[ProtoInclude(4, typeof(ResourceNode<SomeType>))]
public class Node { }
Однако второеБит не может быть четко выражен в любом текущем выпуске.В настоящее время мы не можем использовать:
[ProtoContract]
[ProtoInclude(1, typeof(ShipResource)), ProtoInclude(1, typeof(SomeResource))]
public class ResourceNode<T> : Node { }
, поскольку эти атрибуты применяются к как ResourceNode<Ship>
и ResourceNode<SomeType>
и представляют собой незаконные цепочки наследования.Дублированный 1
в вышеупомянутом является преднамеренным, поскольку они не в конфликте, опять же, потому что они являются параллельными ветвями., настроить эту связь явно:
RuntimeTypeModel.Default.Add(typeof(ResourceNode<Ship>), true)
.AddSubType(1, typeof (ShipResource));
RuntimeTypeModel.Default.Add(typeof(ResourceNode<SomeType>), true)
.AddSubType(1, typeof(SomeResource));
Что я хочу сделать, так это настроить распознаватель так, чтобы он мог обнаружить это как общий случай, так что вы может просто использовать атрибуты:
[ProtoContract]
[ProtoInclude(1, typeof(ShipResource)), ProtoInclude(1, typeof(SomeResource))]
public class ResourceNode<T> : Node { }
Я добавил элемент "todo" и провал тест для этого.Тем не менее, интересно, что при настройке я также нашел сценарий, где что-то не работает, поэтому мне нужно сначала исправить это