2016-11-15 32 views
0

當我有一個嵌套的類型是這樣的:如何在.NET中使用Reflection來區分封閉和嵌套類型參數?

public class MyOuter<T> 
{ 
    public class MyInner { } 
} 

我怎麼知道,使用上typeof(MyInner<int>)反射類型參數T被宣佈MyOuter而不是MyInner?當我呼叫typeof(MyOuter<int>.MyInner).GetGenericArguments()時,它將返回一個包含typeof(int)的數組,typeof(MyOuter<int>).GetGenericArguments()也是如此。

+0

嵌套類型「繼承」從其父類型的泛型參數,你無法避免這樣你就不得不減去從父類繼承的類型。 「繼承的」參數是第一位的。 –

+0

嗯,好的。我發現'Type.FullName'包含了類型參數的個數,例如'MyOuter \'1',但是有沒有比解析字符串更容易的方法? – EM0

回答

1

有一個在你的榜樣(taken from tryroslyn)的反編譯IL:

.class public auto ansi beforefieldinit MyOuter`1<T> 
    extends [mscorlib]System.Object 
{ 
    .class nested public auto ansi beforefieldinit MyInner<T> 
     extends [mscorlib]System.Object 
    { 
    } 
} 

你可以看到,T其實也宣告在內的類型。當您使用反射來獲取內部類型的泛型參數的聲明類型:

var arg = typeof(MyOuter<int>.MyInner).GetGenericTypeDefinition().GetGenericArguments()[0]; 
Console.WriteLine(arg.DeclaringType); 

你會得到

MyOuter`1+MyInner[T] 

這是正確的結果,因爲T是在內部類型聲明。 現在應該很清楚,您正在尋找的信息不是直接可用的,因爲它不會退出。

但好消息是,你可以採取在建議的方法的意見,這可能是這個樣子:

var outerArgs = typeof(MyOuter<int>.MyInner).DeclaringType.GetGenericArguments(); 

var innerArgs = typeof(MyOuter<int>.MyInner).GetGenericTypeDefinition().GetGenericArguments(); 

var realInnerArgs = innerArgs.Skip(outerArgs.Length); 

Console.WriteLine(string.Join(",", realInnerArgs)); 
+0

謝謝,我最終做了這樣的事情,但是在''後面的'FullName'中使用了多個參數。 – EM0

相關問題