簡體   English   中英

使用泛型返回不同類型的無關數據,而無需事先明確了解返回類型

[英]Returning different types of unrelated data using generics without explicit knowledge of the return type beforehand

我希望能夠在程序中查詢一個類以獲取其可用數據。 然后,我想請求該類返回任何可用的數據。 主要問題是該數據很可能與其他任何類型的數據都沒有任何共同點(即不共享任何公共接口等),並且由於此代碼將由客戶端使用,因此如果他們不這樣做,那就太好了。當他們從類中請求數據時,需要明確地知道將返回哪種類型的對象/接口,這使得使用泛型變得困難。

我的代碼當前看起來與此類似-https: //ideone.com/s2fyGt,但顯然不是那么簡單,返回的數據類型當然也不是那么簡單。

有什么辦法可以改變我的要求嗎?

var derivedOneParam = derivedOne.GetParam<ExtraDataOne>(supportedParam);

更像

var derivedOneParam = derivedOne.GetParam(supportedParam);

同時仍然保持其他行為幾乎相同

如果確實不能使返回的數據實現公共接口,則還可以動態訪問該對象:

public override object GetParam(string supportedParam)
{
    ...
}

dynamic derivedOneParam = derivedOne.GetParam(supportedParam);
Console.WriteLine(derivedOneParam.Value);

如果不刪除GetParam方法的通用實現,就無法找到所需的內容。 我永遠不會推薦給有問題的任何人。

注意 :這將需要強制類型轉換,在一般情況下由於編譯時檢查而不需要強制類型轉換。

但是,您需要將方法的返回類型從T更改為object,如下所示:

public interface IAdditionalParams
{
    List<string> SupportedParams { get; }
    object GetParam(string supportedParam);
}

然后在后續方法實現中也是如此。

您可以做的另一種選擇。 我不確定天氣是否可以接受,因為傳遞通用參數也需要它。 將接口設為通用。

public interface IAdditionalParams<T>
{
    List<string> SupportedParams { get; }
    T GetParam<T>(string supportedParam);
}

然后,您只需要在聲明對象時指定泛型即可。

IAdditionalParams<SomeType> parameters = GetSomeParamobj();
parameters.GetParam("string");

如果您只有少數幾種特定類型的類型(例如5或6)由GetParam返回,那么將interface設置為泛型將是很好的選擇。 在這種情況下,您可以創建Fecade那將具有具有不同類型的IAdditionalParams實例的預定義集。

暫無
暫無

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

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