這應該很簡單,但我一直遇到這個問題。我有一個通用類Csvs<T>
,通過名爲Dockets
的屬性返回List<T>
類型的方法。 (該方法讀取CSV文件並返回該CSV文件中記錄的列表,T是該CSV文件的類型,該文件在一系列模型中定義,其中包含標題行作爲屬性)如何在c#中存儲返回的列表<T>?
在我的調用類(我不能使通用),我有一個包含我在T.
使用類的名稱switch (_userInput.CsvType)
{
case CsvType.Type1:
var csvType1 = new Csvs<Type1>(_userInput);
_dockets = csvType1.Dockets;
break;
case CsvType.Type2:
var csvType2 = new Csvs<Type2>(_userInput);
_dockets = csvType2.Dockets;
break;
case CsvType.Type3:
var csvType3 = new Csvs<Type3>(_userInput);
_dockets = csvType3.Dockets;
break;
// more cases here [...]
default:
throw new ArgumentOutOfRangeException();
}
(這將是很好,如果我能找到一個基於一個enum
switch語句比使用這個開關更好的方法,但它現在可行。)
什麼不起作用,或者我不知道該怎麼辦,如何申報_dockets
?由於T可以是任何類型。我試着提取接口ICsvs
,並有類繼承它,然後聲明
var _dockets = new List<ICsvs>;
但是,這將引發一個錯誤,我不能隱式轉換的List<Type1>
爲List<ICsvs>
。
而且我不能將該列表投射到類型List<ICsvs>
。 (然後我得到了一個異常)
無法通過引用轉換型「System.Collections.Generic.List」轉換爲「System.Collections.Generic.List」,裝箱轉換,取消裝箱轉換,包裝轉換,或空類型轉換
如果我使用抽象類,則會發生同樣的情況。
那麼,如何將返回的List存儲在調用類中?我如何聲明可以容納任何類型的字段或屬性?
當您在編譯時知道類型時,泛型始終工作得最好。如果你只知道他們在運行時鍵入,你可能*不想要泛型。 – Jamiec
@Jamiec,通用類的作品...我只是不知道如何存儲返回類型? – ToshiBoy
正是我的觀點。您可以使用開關來實例化正確的泛型類,但不能以任何有意義的方式使用它,因爲您不知道它們的類型。 – Jamiec