有一個在你的榜樣(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));
嵌套類型「繼承」從其父類型的泛型參數,你無法避免這樣你就不得不減去從父類繼承的類型。 「繼承的」參數是第一位的。 –
嗯,好的。我發現'Type.FullName'包含了類型參數的個數,例如'MyOuter \'1',但是有沒有比解析字符串更容易的方法? – EM0