在运行时构建C#泛型类型定义

14 浏览
0 Comments

在运行时构建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()转换为字符串,构建泛型类型字符串...感觉有点不舒服。

0
0 Comments

在上述代码中,我们看到了使用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);
        }
    }
}

0