具有通用属性的C#类

时间:2017-02-10 14:26:49

标签: c# json generics

我试图将api响应映射到自定义api类。 Api总是返回这些json字段:

Success (true/false)
Paginator (object)
Data (object) 

好的,首先两个字段都没有问题,因为它们总是一样的。 但是数据是 - 取决于端点 - 是另一个类(UserGroup等。)

对于所有这些端点,我有一个像user.cs等实体类。

如何将用户对象动态映射到上述ApiResponseClass

如果可能的话,我不想为每个端点制作ApiResponseClasses

很抱歉格式化,我在移动设备上。

3 个答案:

答案 0 :(得分:4)

使用泛型创建一个类,并将Data属性设置为泛型参数。

例如

public class ApiResponse<TData> {
    public bool Success  { get; set; }
    public object Paginator { get; set; }
    public TData Data  { get; set; }
}

public class ApiResponse: ApiResponse<object> {
}

然后可以在服务器上使用这样的端点

public ApiResponse<User> MyUserAction() { ... }

public ApiResponse<Group> MyGroupAction() { ... }

或甚至在反序列化json

时在客户端
ApiResponse<User> response = JsonConvert.DeserializeObject<ApiResponse<User>>(json);

答案 1 :(得分:1)

public class ApiResponse<T>
{
    public bool Success { get; set;}
    public object Paginator { get; set;}
    public T Data { get; set; }
}

public class User
{
    public string Name {get;set;}
    //Other properties
}

然后,根据您目前从Api中读取的内容,您使用<ApiResponse<User>>,这意味着ApiReponse中的T Date设置为用户类型。

e.g。如果你正在使用HttpClient Type

using (var client = new HttpClient())
{
    var response = await client.GetAsync("http://yoururl.com")
    var jsonString = await task.Content.ReadAsStringAsync();
    var model = JsonConvert.DeserializeObject<ApiResponse<User>>(jsonString);
}

答案 2 :(得分:-1)

您可以使用泛型:

public class ApiResponse<T>
{
    public bool IsSuccess { get; set; }
    public object Paginator { get; set; }
    public T Data { get; set; }
}

当API端点返回User作为响应时,只需实例化ApiResponse类:

var response = new ApiResponse<User>