2015-12-29 60 views
2

我想指定約束到一個通用的方法,但我不確定這甚至可能在C#中。如果是這樣,我無法弄清楚語法。目前我有以下幾種:如何分組通用約束?

public TOut GetResponse<TOut, TIn>(TIn message) 
    where TOut : BaseMessageResponse 
    where TIn : BaseMessageRequest 

哪個功能完好。不過,我實際上並沒有發送或接收基類消息,而是派生類。我真正想要的是能夠聲明組,以便我可以在編譯時告訴我是否有不匹配的請求和響應類型。所以,我想這將是這樣的:

public TOut GetResponse<TOut, TIn>(TIn message) 
    (where TOut : Derived1Response 
    where TIn : Derived1Request) 
    (where TOut : Derived2Response 
    where TIn : Derived2Request) 

這是東西,可以在一個單一的方法定義來實現?

還有另一種解決方案,這是具有對於每個對請求/響應的對象的方法定義,並且具有各自的那些調用共同的通用方法我現在有,像這樣:

public Derived1Response GetResponse(Derived1Request request) 
{ 
    return GetResponse<Derived1Response, Derived1Request>(request); 
} 

public Derived2Response GetResponse(Derived2Request request) 
{ 
    return GetResponse<Derived2Response, Derived2Request>(request); 
} 

然而,這會使代碼膨脹,從而破壞了使用泛型的目的。

+0

你爲什麼要指定類型(或爲什麼他們需要的是具體的),另一方面,當你限制他們呢?這可能是真正的問題。 – CSharpie

+0

@CSharpie這是因爲我接口的API。請求和響應對象具有由第三方定義的所有屬性,這些屬性正在被JSON序列化並從JSON序列化。對於特定的請求對象,我希望收到一個特定的響應對象。這就是爲什麼我想要成對限制它們。 –

回答

3

如果是我,我會將泛型定義移出到類級別,併爲不同的請求/響應類型使用不同的實例。

例如

public myClass<TOut, TIn> 
    where TOut : BaseMessageResponse 
    where TIn : BaseMessageRequest 
{ 
    public TOut GetResponse(TIn) 
    { 
     ... 
    } 
} 

然後使用:

var derived1Processing = new myClass<Derived1Response, Derived1Request>(); 
var derived2Processing = new myClass<Derived2Response, Derived2Request>(); 
+0

如果我有不同的結構,這會起作用。不過,我有一個存儲連接和身份驗證信息的父類,因此不需要爲每個單獨的調用指定它。這仍然會允許這種重用,但比我所尋找的更精細。 –

+0

由於我選擇的設計,我最終使用了原來在我的問題中描述的替代方案,這是針對每個單獨對或請求/響應類型的離散方法。然而,既然你的答案也是一個可以接受的解決方案(只是不在我的具體情況),我接受你的答案。 –