c# – 序列化类的子集

我不会介绍我尝试过的所有事情……

这大约是我想要完成的.

public interface IClientDTO {
    string FirstName { get; }
    string LastName { get; }
}

public class DTO : IClientDTO {
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string SSN { get; set; }
}

class Program {
    static void Main(string[] args) {
        DTO dto = new DTO() { FirstName = "John", LastName = "Doe", SSN = "111001111" };
        IClientDTO clientDTO = dto;
        string sDTO = JsonConvert.SerializeObject(dto);
        string sClientDTO = JsonConvert.SerializeObject(clientDTO);

        Debug.WriteLine(sDTO);
        Debug.WriteLine(sClientDTO);
    }
}

我希望我的输出看起来像这样……

{“SSN”:”111001111″,”FirstName”:”John”,”LastName”:”Doe”}

{“FirstName”:”John”,”LastName”:”Doe”}

我认为这不会那么困难,但由于Serializer总是将类型确定为DTO,因此即使在我不想要的情况下也总是得到SSN值.

这当然只是一个小测试.可以说我有一个WebAPI应用程序模拟了这样的东西.

public class AdminController : ApiController {
    public DTO Get() { return new Model().DTO); }
}

public class ClientController : ApiController {
    public IClientDTO Get() { return new Model().DTO); }
}

我希望Serializer只序列化返回类型中定义的那些项.

最佳答案 您可以使用JsonIgnoreAttribute始终不包含SSN.

public class DTO : IClientDTO {
    public string FirstName { get; set; }
    public string LastName { get; set; }
    [JsonIgnore]
    public string SSN { get; set; }
}

如果您想以编程方式确定天气是否包含它,您可以创建两个类 – 具有FirstName,LastName等的基本ClientDTO.然后是ClientWithSSN类型,它继承自ClientDTO并且仅包含SSN.然后,当选择是否返回SSN时,转换为没有ssn的基本类型或返回实际的ClientWithSSN类型.

点赞