我在单独的程序集中有一个通用类:
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]
,然后根据这些类型实例化泛型,但是在此过程中我可能会搞砸,所以我一直在寻找一种更简单,可靠的内置方法来获取此类型的对象。
答案 0 :(得分:2)
该字符串应在另一个程序集中包含该类型的完全限定名称:
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;
}