我试图定义一个抽象类,其他类将对其进行扩展,并且它们必须能够将自己序列化为JSON并从JSON反序列化。我想写这样的抽象类:
public abstract class BaseApiModel {
public abstract string ToJson();
public abstract T FromJson(string json);
}
...其中T
是当前类的类型。然后,我将编写一个扩展类,如下所示:
public class ContactApiModel : BaseApiModel {
public string ContactName { get; set; }
[...other properties...]
public override string ToJson() {
[...return serialized JSON string...]
}
public override ContactApiModel FromJson(string json) {
[...return deserialized object...]
}
}
这当然不起作用,因为未定义抽象类中的T
。但是有什么方法可以在C#中编写“此方法必须返回当前类的类型”?我是否只需要使它返回object
?还是我正在解决这个错误,并且有更好的方法来构造它?
答案 0 :(得分:5)
您可以使用泛型声明基类,在ContactApiModel
类中,只需将T
参数设置为ContactApiModel
,如下所示:
public abstract class BaseApiModel<T> {
...
public abstract T FromJson(string json);
}
public class ContactApiModel : BaseApiModel<ContactApiModel> {
...
public override ContactApiModel FromJson(string json) {
[...return deserialized object...]
}
}
答案 1 :(得分:0)
对于此的未来访客:
更聪明的解决方案是根本不在相应的类中实现该方法,而使用扩展方法:
public static class ExtendBaseApiModel
{
public static string ToJson(this T obj) { /* ... */ }
public static T FromJson<T>(this T obj, string json) where T : BaseApiModel { /* ... */ }
}
这将使您保持类的美观和整洁,并且避免序列化的困扰。
还有..还有话要说
假设这样做是为了在ToJson
方法内提供自定义序列化,并在FromJson
方法内提供自定义反序列化,那么您不应使用自己的怪异方法,而应由框架为您完成。
对于 Json.NET ,应通过在类上使用JsonConverter
属性并在某个地方实现相应的JsonConverter来实现
将扩展方法变量与上面提到的JsonConverter结合使用,您只需调用myobjvar.ToJson(...)