我有一个基础摘要
public abstract class absBase
{
public int A {get;set;}
public string B {get;set;}
public abstract string Generate()
}
public class FirstClass : absBase
{
public override string Generate()
{
//Mapping of certain properties and some calcs
return ObjectRepresentationInStringOrObject;
}
}
现在我想做的是
var a = new FirstClass();
string jsonRep = JsonConvert.Serialize(a);
并让jsonRep成为从Generate()返回的字符串。想法是建立一个用于序列化的对象树,但是叶子会像我想要的那样生成。我已经在实现GetObjectData的根对象中尝试了ISerializeable并调用了Generate抽象方法,但它从未调用过,只是返回对象的属性。
为该类型创建一个自定义转换器,它将调用所需的成员
public class AbsBaseConverter : JsonConverter {
public override bool CanRead {
get {
return false;
}
}
public override bool CanConvert(Type objectType) {
return objectType.IsAssignableFrom(typeof(absBase));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
throw new NotImplementedException();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
var obj = (absBase)value;
var json = obj.Generate();
writer.WriteRaw(json);
}
}
objectType.IsAssignableFrom(typeof(absBase))
方法中的CanConvert
将对所有派生类型的absBase
都返回true。
接下来,相应地修饰基本类型
[JsonConverter(typeof(AbsBaseConverter))]
public abstract class absBase {
public int A { get; set; }
public string B { get; set; }
public abstract string Generate();
}
并在打电话时
var a = new FirstClass();
string jsonRep = JsonConvert.SerializeObject(a);
转换器将在序列化时调用Generate
成员。