[英]Get number of generic type parameters
有什么方法可以獲取未綁定泛型類型的參數數量? 例如:
f(typeof(List<>)) => 1
f(typeof(Dictionary<,>)) => 2
UPD
我知道從Type.Name獲取數字,但是也許有一種直接從Type獲取的方法
您已經有了通用類型定義。 您需要做的就是獲取泛型類型參數:
Type.GetGenericArguments().Length
編輯 :
正如Sebastian指出的那樣,如果您習慣使用C#,這可能會給您帶來令人驚訝的結果,因為C#隱藏了“繼承”的泛型類型參數。 例如:
void Main()
{
typeof(A<>.Nested<>).GetGenericArguments().Dump();
}
public class A<T>
{
public class Nested<V>
{
}
}
將給您{ typeof(T), typeof(V) }
。 這就是.NET類的實際用途-這就是您需要引用它的方式,以及如何通過反射創建它的方式。
僅當您要針對編譯時不知道的類專門使用C#編譯器進行操作時,這才有意義。 這可能意味着您正在嘗試生成C#代碼。 似乎沒有任何支持的方法可以安全地獲得C#的行為-您只需要使用一個真正的代碼生成器,而不是將字符串拍打在一起即可:)
Luaan的答案不適用於嵌套類型。
例如,如果您有OuterClass<,>.InnerClass<>
則可能需要1
參數-但是.NET實際上報告3
。
我發現解決此問題的唯一方法是解析通用類型定義的名稱,如下所示:
public static int GetGenericParameterCount(Type type)
{
if (!type.IsGenericType)
{
return 0;
}
var genericTypeDefName = type.GetGenericTypeDefinition().Name;
int tickIndex = genericTypeDefName.LastIndexOf('`');
if (tickIndex == -1)
{
// This will happen for nested types like "OuterClass<int>.InnerClass".
return 0;
}
return int.Parse(genericTypeDefName.Substring(tickIndex + 1), NumberStyles.None);
}
只需查詢t.GetGenericArguments().Length
即可找到某種類型t
的通用參數(或參數)的總數:
static int GenericParameterCount(this Type t)
=> t.IsGenericType ? t.GetGenericArguments().Length
: 0;
對嵌套類型執行上述操作可能會產生最初令人驚訝的結果。 例如,類型Outer<T>.Inner
具有1個通用參數,類型Outer<T>.Inner<U>
具有2個通用參數。只要您將這些嵌套類型僅視為Inner
或Inner<U>
這似乎是不正確的。 Inner<U>
(即在源代碼中聲明它們的方式)。
(出於相同的原因,即使查詢的類型Inner
看起來不是通用的,您可能最初會驚訝地發現typeof(Outer<T>.Inner).IsGenericType == true
。)
如果您真的只想計算“本地”泛型類型參數並排除從其外部類型繼承的參數,則可以簡單地減去外部類型的( type.DeclaringType
)泛型參數總數:
static int LocalGenericParameterCount(this Type t)
=> t.IsNested ? t.GenericParameterCount() - t.DeclaringType.GenericParameterCount()
: t.GenericParameterCount();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.