我在单独的程序集中有一个泛型类:
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/