2016-07-12 68 views
1

我正在構建一組WCF服務,而且我始終必須做的一件事是在每個操作結束時創建Response消息。
我目前有一個Mapper類,它擁有許多這些創建方法(30+和計數),但是我相信我可以用Generics做同樣的事情。如何使用泛型來清理此代碼?

一對夫婦的方法舉例如下:

public ClientResponse CreateClientResponse(Header inboundHeader, ClientData data) 
    { 
     var response = new ClientResponse() { 
      Header = inboundHeader, 
      Data = data 
     }; 

     return response; 
    } 

    public OrderResponse CreateOrderResponse(GenericHeader inboundHeader, List<OrderData> data) 
    { 
     var response = new OrderResponse() { 
      Header = inboundHeader, 
      Data = data 
     }; 

     return response; 
    } 

ClientResponseOrderResponse目前沒有在任何方面,但兩者看起來一樣與問候方法/屬性等:

public class ClientResponse 
{ 
    public ClientResponse() 
    { 
     Header = new GenericHeader(); 
     Data = new ClientData(); 
    } 

    [DataMember(IsRequired = true)] 
    public GenericHeader Header { get; set; } 

    [DataMember(IsRequired = true)] 
    public ClientData Data {get; set;} 
} 

我的第一次嘗試是引入具有兩個屬性的IResponse<T>,並將其添加到響應類中:

public interface IResponse<T> 
{ 
    GenericHeader Header { get; set; } 
    T Data { get; set; } 
} 

,然後用它在我的泛型方法:

public TOut CreateResponse<TOut, TIn>(GenericHeader inboundHeader, TIn data) where TOut : new() 
{ 
    var response = new TOut(); 
    response.Header = inboundHeader; 
    response.Data = data; 
    return response; 
} 

所以我可以把它像這樣:

var result = CreateResponse<ClientResponse, ClientData>(new GenericHeader(), new ClientData()); 

但是... 顯然泛型代碼不會工作,因爲TOut不知道HeaderData屬性。

我想我需要在這裏使用接口,但我迷路了,我不確定如果我改變它以在界面上工作,我將如何返回具體類TOut

任何幫助感激地收到。

+4

不要你需要的接口添加到類型約束的泛型方法,即像'那裏吹噓:新的(),IResponse ' – stuartd

+0

嗯,聽起來是錯誤的。當然,如果響應與*特定*消息非常強相關並且不依賴於任何特定類型。所以只需要消息處理程序方法返回一個響應對象。 –

+1

添加到你的約束接口...就像「where TOut:IMyContract,new()」 –

回答

0

爲您的回覆添加一個標題通用參數。然後,您可能希望使用流利的構建器語法來獲得美觀(此處未包括)。

public interface IResponse<TData,THeader> 
{ 
    THeader Header { get; set; } 
    TData Data { get; set; } 
} 

public TOut CreateResponse<TOut, TIn,THeader>(TIn data) 
    where TOut : IResponse<TIn,THeader>,new(), THeader: new() 
    => new TOut(){ Header = new THeader(), Data = data,}; 

var result = CreateResponse<ClientResponse, ClientData,GenericHeader>(new ClientData()); 
+0

哈哈,我正要測試完全相同的東西! – Lukos