繁体   English   中英

为什么Assembly.GetType()对通用类型实例不起作用?

[英]Why doesn't Assembly.GetType() work for generic type instances?

我在单独的程序集中有一个通用类:

class MyGenericClass<T> { }

在另一个程序集中,我尝试执行以下操作:

var assembly = System.Reflection.Assembly.LoadFrom(@"C:\path-to\MyClassLibrary.dll");  
var t1 = assembly.GetType("MyClassLibrary.MyGenericClass`1");
var t2 = assembly.GetType("MyClassLibrary.MyGenericClass`1[System.String]");

现在,第一个对GetType调用将返回一个泛型,但是第二个将返回null。

我测试过用List<>类型做同样的事情:

var assembly2 = System.Reflection.Assembly.LoadFrom(@"C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll");
var t3 = assembly2.GetType("System.Collections.Generic.List`1[System.String]");

现在,这次可以了。 返回List<String>的类型。 这让我完全困惑。

为什么当使用类型参数[System.String]调用GetType()不能获取我的类型时,如果使用相同的类型参数调用它能够获取List类型,为什么呢?

还有其他方法可以掌握我的类型吗? 我知道我可以解析类型名称,提取出MyClassLibrary.MyGenericClass'1[System.String] ,然后根据这些类型实例化泛型,但是在此过程中我可能会搞砸一些东西,所以我一直在寻找以获得此类型对象的更简单,可靠的内置方法。

该字符串应在另一个程序集中包含该类型的标准名称:

var t2 = assembly.GetType("MyClassLibrary.MyGenericClass`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]");

您可能要考虑实现一个为您提供类型的自定义方法:

static Type GetType(Assembly assembly, string typeName)
{
    Type type = assembly.GetType(typeName);
    if (type == null)
    {
        int index = typeName.IndexOf("`1");
        if (index != -1)
        {
            index += 2;
            ReadOnlySpan<char> span = typeName.AsSpan();
            type = Type.GetType(span.Slice(0, index).ToString());
            return type.MakeGenericType(Type.GetType(span.Slice(index + 1, span.Length - index - 2).ToString()));
        }
    }
    return type;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM