簡體   English   中英

返回泛型類型的泛型方法

[英]Generic method returning generic type

我正在使用一個接受類型的restclient,后來轉換為正確的IRestResponse

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

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

公共接口IRestClient {IRestResponse response = 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();
}

簽名是:

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

new泛型約束不允許抽象類。 相反,你可以:

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

我個人 - 我會說接口選項 - 但這是基於意見:)

在任何情況下,對於PerformExecuteClient<T>它必須至少遵循它執行的Execute<T>的通用約束。

你試過這個:

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

正如大家在這里指出的那樣,你必須遵循界面的通用約束才能使其工作。 如果不這樣做,則不會通過傳遞意外類型來尊重接口合同。

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

這個 :

where T : new();

意味着T將在方法內部創建。 但是如何創建抽象類的實例呢? 因此出錯了。

客戶端對象上的Execute方法可能有一個T: [Something]約束,您的泛型方法也需要應用。 查看源代碼(如果可能)或文檔以查看where約束是否應用於泛型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM