如何在C#中一般实例化泛型类?

Gir*_*rdi 1 c# generics instantiation

也许这很简单,但我没有使用Type它的类型和它的用途.

假设我想List<T>T= DoubleT= 创建一个UInt32,取决于某些函数的结果,比方说public static Type CheckType(String input);

在代码中:

Type t = Program.CheckType(someInput); // it returns typeof(Double) or typeof(UInt32)
if (t == typeof(Double))
    List<Double> l = new List<Double>();
else
    List<UInt32> l = new List<UInt32>();
Run Code Online (Sandbox Code Playgroud)

我知道上面的代码不会编译,因为我要让它l有两个不同的含义(一个double列表和一个unsigned int列表)......所以它引出了我的问题:

  • 有没有办法避免if上面的代码?

与此类似的东西:

Type t = Program.CheckType(someInput);
List<t> l = new List<t>(); // I know this won't compile either...
Run Code Online (Sandbox Code Playgroud)

我的意思是,这通常会实例化一个通用List ...

先感谢您!

编辑:

这是不是重复的的显着问题,原因只有一个:DoubleUInt32是不是匿名类型!的问题,在这里,是如何确定一些输入数据的类型(这将是Type T= typeof(Double)Type T= typeof(UInt32),例如),因此,创建一个通用 SampleClass<T> 基于该输入数据类型,T!

换句话说:Type T在运行时中确定一些,然后使用确定的类型实例化泛型类型T.对不起,如果我之前没有说清楚......

PS:我用它List<T>作为例子SampleClass<T>.

Lee*_*Lee 6

您不能将列表键入为通用列表,因为您不知道类型参数,但可以在运行时创建List实例.

Type t = Program.CheckType(someInput);
Type listType = typeof(List<>).MakeGenericType(t);
IList list = (IList) Activator.CreateInstance(listType);
Run Code Online (Sandbox Code Playgroud)

如果您尝试添加不正确类型的对象,您将获得异常,因此这种方法优于使用类似的集合ArrayList,或者List<object>

  • @Servy - 它被输入为"IList",所以它没有任何安全感.如果一个集合应该只包含一种类型的元素,那么即使它没有作为一个类型,也最好使用通用列表,因此这很难"与泛型设计相反".如果这是Java,那么我会同意没有任何好处.运行时异常比静默数据错误更容易修复,你可以使用`List <object>`来获得. (3认同)