【发布时间】:2018-09-26 19:01:46
【问题描述】:
我正在尝试定义一个其他类将扩展的抽象类,它们必须能够将自己序列化为 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吗?还是我接近这个错误并且有更好的方法来构建它?
【问题讨论】:
-
为什么要这样做?您正在将序列化程序/映射硬编码到一个不应该对此一无所知的类中
-
可以给BaseApiModel添加类型参数。调用它
TThis并在派生类时传递它。例如,C# 没有像 Typescript 这样的多态this类型 -
@PanagiotisKanavos 那么您建议将
ToJson和FromJson方法放在哪里? -
在实际需要生成JSON的代码中,例如控制器动作。也许甚至不存在——例如,ASP.NET Web API 负责(反)序列化本身。 API DTO 不需要任何特定的处理来进行序列化。如果需要,它们就不是 API DTO。也许您应该寻找将模型映射到 DTO 的方法?
-
@PanagiotisKanavos 这些不仅仅是 DTO 类,它们所做的不仅仅是存储数据。
标签: c# generics design-patterns types