有没有一种方法可以在C#方法签名中指定“当前类的类型”?

时间:2018-09-25 12:07:15

标签: c# generics design-patterns types

我试图定义一个抽象类,其他类将对其进行扩展,并且它们必须能够将自己序列化为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?还是我正在解决这个错误,并且有更好的方法来构造它?

2 个答案:

答案 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 { /* ... */ }
}

这将使您保持类的美观和整洁,并且避免序列化的困扰。

还有..还有话要说

如何 de 正确序列化

假设这样做是为了在ToJson方法内提供自定义序列化,并在FromJson方法内提供自定义反序列化,那么您不应使用自己的怪异方法,而应由框架为您完成。

对于 Json.NET ,应通过在类上使用JsonConverter属性并在某个地方实现相应的JsonConverter来实现

有趣的事实

将扩展方法变量与上面提到的JsonConverter结合使用,您只需调用myobjvar.ToJson(...)

就可以序列化每个对象。