在运行时构建C#泛型类型定义
在运行时构建C#泛型类型定义
目前我不得不这样做,以在运行时构建一个类型定义,然后传递给我的IOC容器进行解析。简化的代码如下:
Type t = Type.GetType( "System.Collections.Generic.List`1[[ConsoleApplication2.Program+Person");
我只在运行时得知泛型类型参数。
有没有办法让我像这样做(伪代码):
Type t = Type.GetTypeWithGenericTypeArguments( typeof(List) , passInType.GetType());
还是我应该坚持我的hack方法,即passInType.GetType()
转换为字符串,构建泛型类型字符串...感觉有点不舒服。
在上述代码中,我们看到了使用MakeGenericType
方法来在运行时生成C#泛型类型的示例。这个方法的作用是根据传入的类型参数生成一个具体的泛型类型。
在示例中,我们首先获取了一个Type
对象passInType
,该对象表示了程序集中的一个特定类型。然后,我们调用MakeGenericType
方法,将passInType
作为参数传入,以生成一个具体的泛型类型。在示例中,我们使用了List<>
作为基础泛型类型,并将passInType
作为类型参数传入。
这样,我们就生成了一个具体的泛型类型List<Person>
。
这个示例中的问题是,如果我们在编译时无法确定类型参数,我们就无法直接使用泛型类型。这是因为C#是一种静态类型语言,要求在编译时就确定变量的类型。
然而,使用MakeGenericType
方法,我们可以在运行时动态地生成具体的泛型类型,从而绕过了编译时的限制。
总结一下,MakeGenericType
方法的作用是在运行时生成C#泛型类型。它解决了在编译时无法确定类型参数的问题,通过动态生成具体的泛型类型,使我们能够在运行时使用泛型类型。
代码示例:
using System; using System.Collections.Generic; using System.Reflection; namespace ConsoleApplication2 { class Program { class Person {} static void Main(){ Assembly myAssembly = typeof(Program).Assembly; Type passInType = myAssembly.GetType("ConsoleApplication2.Program+Person"); Type t = typeof(List<>).MakeGenericType(passInType); } } }