当泛型参数来自多个程序集时,按名称加载泛型类型

Joh*_*aze 6 .net c# reflection assemblies

我需要从它的全名创建一个类型Ex:"System.String"或"Tuple'2 [string,Mytype]".字符串中没有关于程序集的信息.这是代码的样子.

private static Type LoadType(string typeName)
{
    // try loading the type
    Type type = Type.GetType(typeName, false);

    if (type != null)
        return type;

    // if the loading was not successfull iterate all the referenced assemblies and try to load the type.
    Assembly asm = Assembly.GetEntryAssembly();
    AssemblyName[] referencedAssemblies = asm.GetReferencedAssemblies();
    foreach (AssemblyName referencedAssemblyName in referencedAssemblies)
    {
        type = referencedAssembly.GetType(typeName, false);
        if (type != null)
            return type;
    }
    throw new TypeLoadException(string.Format("Could not load the Type '{0}'",typeName));
}
Run Code Online (Sandbox Code Playgroud)

当类型不是通用的时,此方法有效.但是对于泛型类型,遍历程序集总是失败,因为没有程序集包含构建类型所需的所有定义.

有没有办法在调用GetTypes时为类型解析提供多个程序集?

Eri*_*ert 7

你将不得不以我认为的艰难方式去做.幸运的是,这并不难.很简单:

  • 将类型名称解析为类型定义和泛型类型参数.
  • 获取泛型类型定义对象
  • 获取每个泛型类型参数的类型对象
  • 使用类型定义对象上的MakeGenericType方法,使用泛型类型定义和泛型类型参数构造泛型类型.

  • 输入genericType = typeof(Dictionary <,>); 类型constructType = genericType.MakeGenericType(new Type [] {typeof(String),typeof(String)}); (4认同)

Sky*_*ers 6

像这样......

Type.GetType("namespace.typename`1[[namespace.typename, assemblyname]], assemblyname");
Run Code Online (Sandbox Code Playgroud)

例如

var type = Type.GetType("System.Collections.Generic.List`1[[System.String, mscorlib]], mscorlib");
var instance = Activator.CreateInstance(type);
Run Code Online (Sandbox Code Playgroud)

或者,正如埃里克所说..如果你手头有类型,那就建立它吧.

Type genericType = typeof(Dictionary<,>);
Type constructedType = genericType.MakeGenericType(new Type[] { typeof(String), typeof(String) });
Run Code Online (Sandbox Code Playgroud)