C# 为什么';t Assembly.GetType()是否适用于泛型类型实例?
我在一个单独的程序集中有一个泛型类:C# 为什么';t Assembly.GetType()是否适用于泛型类型实例?,c#,generics,reflection,C#,Generics,Reflection,我在一个单独的程序集中有一个泛型类: class MyGenericClass<T> { } var t2 = assembly.GetType("MyClassLibrary.MyGenericClass`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"); 现在,对GetType的第一个调用将返回泛型类型,但第二个调用将返回null
class MyGenericClass<T> { }
var t2 = assembly.GetType("MyClassLibrary.MyGenericClass`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]");
现在,对GetType
的第一个调用将返回泛型类型,但第二个调用将返回null
我对列表进行了相同的测试
类型:
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]");
现在,这一次成功了。将返回列表的类型。这让我非常困惑
当使用类型参数[System.String]
调用GetType()
时,当使用相同的类型参数调用列表时,为什么不能获取我的类型
还有没有其他方法可以找到我喜欢的类型?我知道我可以解析类型名,提取部分MyClassLibrary.MyGenericClass'1
和[System.String]
,然后基于这些类型实例化泛型类型,但我可能会在过程中弄糟一些东西,所以我在寻找一个更简单、可靠的,获取此类型对象的内置方法。字符串应包括其他程序集中类型的完全限定名:
class MyGenericClass<T> { }
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;
}
静态类型GetType(程序集,字符串类型名)
{
Type Type=assembly.GetType(typeName);
if(type==null)
{
int index=typeName.IndexOf(`1”);
如果(索引!=-1)
{
指数+=2;
ReadOnlySpan=typeName.AsSpan();
type=type.GetType(span.Slice(0,index.ToString());
返回type.MakeGenericType(type.GetType(span.Slice(index+1,span.Length-index-2).ToString());
}
}
返回类型;
}
使用Type.IsGenericType
和Type.GetGenericTypeDefinition()
将“MyGenericClass`1[System.String]”转换为“MyGenericClass`1”Type.GetGenericArguments()
获取“System.String”位,并使用Type.MakeGenericType()
将打开的泛型MyGenericClass
转换为MyGenericClass
。但我没有“MyGenericClass`1[System.String”类型,我只有那个文本字符串。我需要从一个字符串转到另一个类型。你是如何得到那个字符串的?这可能是要解决的第一件事。另请参见-grave-1表示该类型有一个泛型类型。你可以检查字符串中的-grave-1。P.S我无法转义grave字符