类具有空属性

问题描述:

我有以下接口:类具有空属性

public interface IResponse<T> { 
    IList<Error> Errors { get; } 
    IPaging Paging { get; } 
    IList<T> Result { get; }  
} 

而且它的实现:

public class Response<T> : IResponse<T> { 

    IList<Error> Errors { get; private set; } 
    public IPaging Paging { get; private set; } 
    public IList<T> Result { get; private set; } 

    public Response(IList<T> result, IPaging paging, IList<Error> errors) { 
    Errors = errors; 
    Paging = paging; 
    Result = result; 
    } 

} 

于是我就用它,如下所示:

Response<MyModel> response = new Response<MyModel>(); 

在一些情况下,我需要创建一个响应,我没有一个T和分页和结果为空...他们是空的,但仍然存在于o bject。

Response response = new Response(); 

随着我有什么不会的工作(我认为在这些情况下,有没有一种模式。):

Response<?> response = new Response<?>(); 

这样做的原因是,我会响应转换成JSON和我仍然希望Paging和Result出现。

这样做的最好方法是什么?

+6

'新的响应(NULL,NULL,NULL)'?或者提供空列表和一个实现“IPaging”的'空对象'。 “它们是空的,但仍然存在于对象中”并不完全清楚你的意思。 –

+0

“他们是空的,但仍然存在于类”...因此,当我转换为Json时,分页和结果仍然显示为属性,但为空。 –

+6

如果属性未显示在输出中,则可能需要将JSON序列化设置调整为始终包含空值。假设你正在使用Newtonsoft:http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_NullValueHandling.htm – xDaevax

你不应该需要做任何代码更改机型,如果你正在使用Newtonsoft序列化,你可以做类似如下:

void Main() { 
    Response<MyResponse> myResponse = new Response<MyResponse>(new List<MyResponse>(), null, null); 
    var serializer = new JsonSerializer(); 
    StringBuilder sb = new StringBuilder(); 

    using(var writer = new StringWriter(sb)) { 
     using (var jWriter = new JsonTextWriter(writer)) { 
      serializer.NullValueHandling = NullValueHandling.Ignore; 
      serializer.Serialize(jWriter, myResponse); 
     } 
    } 

    Console.WriteLine(sb.ToString()); 
} 

public interface IResponse<T> { 
    IList<Error> Errors { get; } 
    IPaging Paging { get; } 
    IList<T> Result { get; }  
} 

public class Response<T> : IResponse<T> { 

    public IList<Error> Errors { get; private set; } 
    public IPaging Paging { get; private set; } 
    public IList<T> Result { get; private set; } 

    public Response(IList<T> result, IPaging paging, IList<Error> errors) { 
    Errors = errors; 
    Paging = paging; 
    Result = result; 
    } 

} 

public class Error { 


} 

public interface IPaging { 

} 

public class MyResponse { 
    public string Name {get; set;} 
} 

运行上面的代码产生以下输出:

{"Result":[]} 

在此线路更改串行设置:

serializer.NullValueHandling = NullValueHandling.Ignore; 

serializer.NullValueHandling = NullValueHandling.Include; 

结果变成:

{"Errors":null,"Paging":null,"Result":[]}