c# - 为什么 Assembly.GetType() 不适用于泛型类型实例?

标签 c# generics reflection

我在单独的程序集中有一个泛型类:

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>的类型被返回。这让我完全困惑。

为什么会GetType()使用类型参数调用时无法获取我的类型 [System.String] ,当能够得到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;
}

关于c# - 为什么 Assembly.GetType() 不适用于泛型类型实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55496863/

相关文章:

go - 如何在 reflect.New 创建时按其类型转换 reflect.Value

c# - 为什么 UDPclient 多播不工作?

c# - 通用对象比较 diff 例程

Java 反射 : Class Annotations coming back null unexpectedly at runtime

c# - 泛型和返回类对象

java - 为什么我不能在参数中使用通配符类型来计算

c# - 比较通用接口(interface)类型

c# - 我什么时候应该在 .NET 应用程序中实现全局化和本地化?

java - 具体的Java代码到C#

c# - 在 C# 中一般访问多维数组