Создайте пользовательский конвертер для типа, который будет вызывать нужный элемент
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
вернет true для всех производных типов absBase
.
Затем украсьте базовый тип соответственно
[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
при сериализации.