Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么';t Assembly.GetType()是否适用于泛型类型实例?_C#_Generics_Reflection - Fatal编程技术网

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字符