2016-03-04 78 views
2

我有以下接口:類具有空屬性

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

回答

1

你不應該需要做任何代碼更改機型,如果你正在使用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":[]}