【问题标题】:Resolving the metadata token of a generic type parameter解析泛型类型参数的元数据标记
【发布时间】:2009-08-08 19:58:10
【问题描述】:

.NET 4.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);
}

【问题讨论】:

    标签: .net reflection clr


    【解决方案1】:

    【讨论】:

    • 那是用来做别的事的。我目前在 C# 代码中没有使用它的示例——它可能不是你想的那样。 typeof(List&lt;int&gt;) != typeof(List&lt;&gt;).Module.Resolve(typeof(List&lt;&gt;).MetadataToken, new Type { typeof(int) }, null)
    • KeyedCollection&lt;TKey,TItem&gt; 的基本类型的内部表示是Collection&lt;TItem&gt; 的 TypeSpec 元数据标记,其中TItem 指回KeyedCollection 对应的泛型参数。要解析该 TypeSpec,您需要将 typeof(KeyedCollection&lt;,&gt;).GetGenericArguments() 传递给 ResolveType。但是,我知道在 C# 中没有办法让 TypeSpec 令牌向您展示这一点。
    • 是的,我明白了.. 我想我在某处读到了反射无法对元数据执行的操作列表,我认为这属于此类。不过听起来很有趣。您是否看过元数据非托管 API?
    猜你喜欢
    • 2014-07-14
    • 1970-01-01
    • 2014-11-25
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    相关资源
    最近更新 更多