簡體   English   中英

獲取泛型類型參數的數量

[英]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個通用參數。只要您將這些嵌套類型僅視為InnerInner<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM