.net 解析泛型类型参数的元数据标记
.NET4.0(或更早版本)反射API是否有办法解析泛型类型参数?请参阅我当前尝试的ArgumentException注释后的两行.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
[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?