我有一个基本摘要
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并调用Generate抽象方法的根对象中尝试过ISerializeable,但从未调用它,只是返回对象的属性。
答案 0 :(得分:4)
为该类型创建一个自定义转换器,该转换器将调用所需的成员
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
成员。