2009-08-08 94 views
3

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

回答

0

那麼Module.ResolveType(int, Type[], Type[])過載怎麼樣?

+0

這是用於別的東西。我目前沒有使用C#代碼的例子 - 這可能不是你想象的那樣。 'typeof(List )!= typeof(List <>)。Module.Resolve(typeof(List <>)。MetadataToken,new Type {typeof(int)},null)' – 2009-08-08 20:15:14

+0

' KeyedCollection '是'Collection '的TypeSpec元數據標記,其中'TItem'返回到'KeyedCollection'的相應通用參數。爲了解決這個TypeSpec,你需要將'typeof(KeyedCollection <,>).GetGenericArguments()'傳遞給'ResolveType'。然而,我知道在C#中沒有辦法讓TypeSpec令牌向你展示這個動作。 – 2009-08-08 20:27:34

+0

是啊,我明白了..我想我在某處讀了反射對元數據無法做到的事情列表,我認爲這屬於這個列表。聽起來很有趣。你有沒有看過元數據非託管API? – 2009-08-08 21:11:09