我正在構建一組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;
}
的ClientResponse
和OrderResponse
目前沒有在任何方面,但兩者看起來一樣與問候方法/屬性等:
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
不知道Header
和Data
屬性。
我想我需要在這裏使用接口,但我迷路了,我不確定如果我改變它以在界面上工作,我將如何返回具體類TOut
。
任何幫助感激地收到。
不要你需要的接口添加到類型約束的泛型方法,即像'那裏吹噓:新的(),IResponse' –
stuartd
嗯,聽起來是錯誤的。當然,如果響應與*特定*消息非常強相關並且不依賴於任何特定類型。所以只需要消息處理程序方法返回一個響應對象。 –
添加到你的約束接口...就像「where TOut:IMyContract,new()」 –