这应该很简单,但我一直遇到这个问题。我有一个通用类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