创建继承的响应对象

时间:2018-08-30 01:17:10

标签: c# asp.net inheritance response

我正在与第三方电子学习平台进行一些集成,该平台将根据我宁静的API调用的功能以不同的模式返回各种响应。由于这些响应以几种不同的模式返回,因此我尝试创建一系列响应对象类,这些对象类继承了一个基础Response对象类,该对象类将包含常见的JSON部分(即“数据”和“消息”)并允许每个响应对象根据返回的响应覆盖或具有其他成员/类。

以下是有关架构如何不同的几个示例。

类创建返回:

{
  "data": [
    {
      "row_index": 0,
      "success": true,
      "message": "string"
    }
  ]
}

用户创建返回:

{
  "data": [
    {
      "message": [
        {
          "id": "string",
          "message": "string"
        }
      ],
      "success": true,
      "user_id": 0
    }
  ]
}

如您所见,不同的响应具有不同的模式。类创建仅返回数据对象内的message成员,而用户创建共有一个单独的message对象。

由于由于含糊不清,我在每个对象中都没有一个名为data的类,因此我想我需要创建一个包含公共成员的基本响应对象,并允许我覆盖或添加视需要飞行。

我试图创建一个基类:

public class BaseResponse
{
    public List<Data> data;
    public class Data
    {
        public bool success { set; get; }
    }
}

以及示例派生类:

public class ClassroomResponse : BaseResponse
{
    public class Data
    {
        public int row_index { get; set; }            
        public string message { get; set; }   
    }
}

我不确定这是否仅适用于函数而不是类(如我在上面尝试的那样)?有没有一种方法可以将其他成员添加到派生对象的对象中(row_indexmessage不是所有响应的成员,所以我希望能够根据需要获取这些成员)

2 个答案:

答案 0 :(得分:2)

您可以为每种类型创建单独的,不同的类,根据您未显示的其他变体,此处可能是正确的选择。或者您可以使用泛型。您可以通过多种方式来执行此操作,但这是您可以执行的一种方式。

总体响应的基类:

public abstract class Response<TData>
{
    [JsonProperty("data")]
    public TData Data { get; set; }
}

数据对象的基类:

public abstract class BaseData<TMessage>
{
    [JsonProperty("success")]
    public bool Success { get; set; }
    [JsonProperty("message")]
    public TMessage Message { get; set; }
}

用于创建类的响应类型:

public class ClassData : BaseData<string>
{
    [JsonProperty("row_index")]
    public int RowIndex { get; set; }
}

用户创建的响应类型:

public class UserData : BaseData<UserMessage>
{
    [JsonProperty("user_id")]
    public int UserId { get; set; }
}

public class UserMessage
{
    [JsonProperty("id")]
    public int Id { get; set; }
    [JsonProperty("message")]
    public string Message { get; set; }
}

最后是整体响应类型:

public class ClassResponse : Response<ClassData>
{ }

public class UserResponse : Response<UserData>
{ }

现在您可以像平常一样使用对象了

var classData = new ClassResponse {Data = new ClassData {Message = ""}};
var classJson = JsonConvert.SerializeObject(classData);

var userData = new UserResponse {Data = new UserData {Message = new UserMessage {Message = ""}}};
var userJson = JsonConvert.SerializeObject(userData);

答案 1 :(得分:1)

我将遵循通用路线

假设我们对 Class 创建的回复为

public class ClassResponseObject {
    public int row_index { get; set; }
    public bool success { get; set; }
    public string message { get; set; };
}

,并创建 User

public class UserResponseObject {
    public int user_id { get; set; }
    public bool success { get; set; }
    public MessageResponseObject message { get; set; };
}

以及消息

public class MessageResponseObject {
    public string id { get; set; }
    public string message { get; set; };
}

看到上面的代码后,我们可以发现我们在两个响应中都具有成功属性,因此让我们创建一个具有该属性的基类,并从中继承这些类。

public class BaseResponseObject {
    public bool success { get; set; }
}

public class ClassResponseObject : BaseResponseObject {
    public int row_index { get; set; }
    public string message { get; set; };
}

public class UserResponseObject : BaseResponseObject {
    public int user_id { get; set; }
    public MessageResponseObject message { get; set; };
}

在这一点上,我们看到的另一个常见属性是消息,但是两者都有不同的类型。这可以通过使用泛型来解决。我正在考虑响应的message属性可能有更多类型,但是无论哪种情况都应该起作用。

为此,请修改我们的 BaseResponseObject 并将消息属性移到此处

public class BaseResponseObject<TMessage> {
    public bool success { get; set; }
    public TMessage message { get; set; }
}

所以我们的响应对象将变成这样:

public class ClassResponseObject : BaseResponseObject<String> {
    public int row_index { get; set; }
}

public class UserResponseObject : BaseResponseObject<MessageResponseObject> {
    public int user_id { get; set; }
}

最后一步,我们需要为实际响应定义最终的类

public class APIResponse<TResponse> {
    public List<TResponse> data { get; set; }
}

现在,当您捕获 Class 创建的响应时,您只需在

中捕获它
APIResponse<ClassResponseObject>

用户创建类似,将其捕获

APIResponse<UserResponseObject>

我希望这会有所帮助。