У меня есть тип Parent
, одно из его полей - Discriminated Union
(JsonSubTypes
). В моем примере ниже я сохраняю Discriminant
(id) внутри моего дочернего поля.То, что я хочу знать: возможно ли иметь discriminant
вне моего child
объекта и непосредственно в родительском объекте?
Что работает
public class Parent{
Child childField{get;set;}
}
[JsonConverter(typeof(JsonSubTypes),CHILDTYPE)]
[JsonSubTypes.KnownSubTypes(typeof(Child1),CTYPE.Child1)]
[JsonSubTypes.KnownSubTypes(typeof(Child2),CTYPE.Child2)]
public abstract class Child{
public enum Discriminator{
Child1=0,
Child2=1
}
private const string CHILDTYPE="childType";
[JsonProperty(CHILDTYPE)]
public abstract Discriminator Kind{get;} //i want this moved to parent
}
public class Child1:Child{
public int Value{get;set;}
public override Kind=>Discriminator.Child1;
}
public class Child2:Child{
public bool Value{get;set;}
public override Kind=>Discriminator.Child2;
}
Использование
List<Parent>parents=new List<Parent>{new Child1{Value=3},new Child2{Value=True}};
var str=JsonConvert.SerializeObject(parents);
List<Parent>parents=JsonConvert.DeserializeObject<List<Parent>(str);
Что я хочу
public class Parent{
private const string CHILDTYPE="childType";
public enum Discriminator{
Child1=0,
Child2=1
}
public abstract Discriminator Kind{get;}
Child childField{get;set;}
}
[JsonConverter(typeof(JsonSubTypes),CHILDTYPE)]
[JsonSubTypes.KnownSubTypes(typeof(Child1),CTYPE.Child1)]
[JsonSubTypes.KnownSubTypes(typeof(Child2),CTYPE.Child2)]
public abstract class Child
{
}
Как вы можете видеть, что я хочу, чтобы переместить мое Kind
поле из Child
и в Parent
. Могу ли я как-нибудь это сделать?Я хочу сохранить все то же самое, просто вместо Json
, как это:
{
childField:{ Kind:3}
}
Мне нужно разместить для JSON, как это:
{
Kind:3
childField:{}
}
Могу ли я сделать это?Могу ли я как-то украсить родителя, чтобы знать, как десериализовать одно из его полей на основе другого?