2016-08-17 181 views
3

我正在使用接受類型的restclient,稍後將其轉換爲正確的IRestResponse返回泛型類型的泛型方法

IRestResponse<MyClassA> response = client.Execute<MyClassA>(); 

由於MyClassA也可以MyClassBMyClassC我想過做這可能處理這個的通用方法。然而沒有任何運氣。這是我的嘗試:

公共接口IRestClient { IRestResponse響應= PerformExecuteClient()

private RestResponse<T> PerformExecuteClient<T>() { 
    return client.Execute<T>(); 
} 

編譯器告訴我,client.Execute<T>不接受抽象類型。這是有道理的,但我不知道如何做其他方法。這可能是我想在這裏實現的嗎?

基於一些評論的補充信息。正如Brains Mains所建議的,該方法在這裏不接受抽象類型。

public interface IRestClient{ 
    IRestResponse<T> Execute<T>(IRestRequest request) where T : new(); 
} 
+2

您可以顯示客戶的類別,特別是執行的簽名嗎? –

+0

爲什麼你需要這種方法,而不是直接使用'client.Execute '?你得到的編譯錯誤是什麼? 'client.Execute '對'T'有'new()'約束嗎? – Lee

+0

Follwing Lee的評論你可以這樣做:'var response = client.Execute ();'如果你想讓寫作更容易一點.. –

回答

2

的簽名是:

IRestResponse<T> Execute<T>(IRestRequest request) where T : new(); 

的的newgeneric constraint不允許抽象類。 取而代之,您可以:

  1. 爲您的類提供一個接口並對其有一個通用約束。
  2. 更改MyClassA到不是抽象
  3. 刪除約束

我個人 - 我想說的接口選項 - 但這是基於

意見:)在任何情況下它必須至少遵循其執行的Execute<T>的一般約束。

+1

由於restclient來自外部庫,我無法刪除該約束。使用我的類的接口確實解決了這個問題。謝謝! –

+0

快樂它給了你一個解決方案:) –

0

客戶對象上執行方法可以有一個地方T: [Something]約束,你的泛型方法也需要提出申請。查看源代碼(如果可能)或文檔以查看泛型是否應用了where約束。

1

此:

where T : new(); 

就是說T將方法的內創建。但是,你怎麼能創建抽象類的實例?因此一個錯誤。

2

你有沒有嘗試這個辦法:

private RestResponse<T> PerformExecuteClient<T>() where T : new() 
{ 
    return client.Execute<T>(); 
} 

大家都在這裏指出,你必須遵循該接口的通用約束,使這項工作。如果你不這樣做,你不會通過傳遞意想不到的類型來尊重接口契約。

另外where T : new()意味着你可以像這樣new T()實例化T。但是根據定義,抽象類不能實例化,這就是爲什麼你會得到這個錯誤。