Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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
.net 解析泛型类型参数的元数据标记_.net_Reflection_Clr - Fatal编程技术网

.net 解析泛型类型参数的元数据标记

.net 解析泛型类型参数的元数据标记,.net,reflection,clr,.net,Reflection,Clr,.NET4.0(或更早版本)反射API是否有办法解析泛型类型参数?请参阅我当前尝试的ArgumentException注释后的两行 [TestMethod] public void TestGenericParameterTokenResolution() { Type genericParameter = typeof(List<>).GetGenericArguments()[0]; Assert.IsTrue(genericParameter.IsGeneric

.NET4.0(或更早版本)反射API是否有办法解析泛型类型参数?请参阅我当前尝试的ArgumentException注释后的两行

[TestMethod]
public void TestGenericParameterTokenResolution()
{
    Type genericParameter = typeof(List<>).GetGenericArguments()[0];
    Assert.IsTrue(genericParameter.IsGenericParameter);
    int metadataToken = genericParameter.MetadataToken;

    // make sure the metadata token is a GenericParam
    Assert.AreEqual(metadataToken & 0xFF000000, 0x2A000000);

    Module module = typeof(List<>).Module;
    // the following both throw an ArgumentException.
    Type resolvedParameter = module.ResolveType(metadataToken);
    resolvedParameter = (Type)module.ResolveMember(metadataToken);

    Assert.AreSame(genericParameter, resolvedParameter);
}
[TestMethod]
public void TestGenericParameterTokenResolution()
{
Type genericParameter=typeof(List).GetGenericArguments()[0];
IsTrue(genericParameter.IsGenericParameter);
int metadataToken=genericParameter.metadataToken;
//确保元数据令牌是GenericParam
AreEqual(metadataToken&0xFF000000,0x21000000);
模块=类型(列表)。模块;
//以下两个都会引发ArgumentException。
类型resolvedParameter=module.ResolveType(metadataToken);
resolvedParameter=(类型)module.ResolveMember(metadataToken);
Assert.AreName(genericParameter,resolvedParameter);
}

过载怎么办?

用于其他用途。我目前还没有一个C#代码使用它的例子——它可能不是你想象的那样<代码>类型(列表)!=typeof(List).Module.Resolve(typeof(List).MetadataToken,新类型{typeof(int)},null)基类型
KeyedCollection
的内部表示是
集合的TypeSpec元数据标记,其中
TItem
引用了
KeyedCollection
的相应泛型参数。要解析该类型规范,需要将
typeof(KeyedCollection).GetGenericArguments()
传递到
ResolveType
。然而,我知道在C#中没有办法让TypeSpec令牌在实际操作中向您展示这一点。是的,我明白了。。我想我在某个地方读到了一个清单,上面列出了反射不能处理元数据的事情,我认为这属于这个范围。听起来很有趣。您是否看过元数据非托管API?