簡體   English   中英

判斷字段是否為泛型

[英]Determine whether field is of generic type or not

是否可以通過反射確定字段是否屬於泛型類型?

如果可能,怎么做?

我想我的問題不夠清楚,所以我現在正在編輯它。

編輯:

如果 a 將具有如下示例中定義的類型並且沒有Holder<T>類型的實例,但只有通過System.Reflection.Assembly.GetTypesSystem.Reflection.FieldInfo實例檢索到的System.Type實例描述字段 _instance,如何我可以確定 _instance 字段是否屬於泛型類型

public class Holder<T>
{
   private T _instance;
}

使用字段的 FieldInfo,如果您想知道字段本身是否是泛型類型,可以檢查 FieldType 屬性的 IsGenericType 屬性。

 var info = type.GetField("myField",BindingFlags.Private);
 if (info != null)
 {
      if (info.FieldType.IsGenericType)
      {
           Console.WriteLine( "The type of the field is generic" );
      }
 }

如果您要檢查該字段是否屬於通用 class 定義中的通用類型,那么您需要檢查 IsGenericParameter。

 var info = type.GetField("myField",BindingFlags.Private);
 if (info != null)
 {
      if (info.FieldType.IsGenericParameter)
      {
           Console.WriteLine( "The type of the field is the generic parameter of the class" );
      }
 }

當然,您可以將這些組合起來。 檢查該字段是否是泛型定義的 class 中類型的泛型,問題更大,但仍然可以完成。 您只需檢查泛型類型的類型參數,看看其中一個是否設置了 IsGenericParameter。 注意下面的例子只有一層深; 如果你想要一些全面的東西,你會想要定義一個方法並遞歸地使用它。

var info = type.GetField("myField",BindingFlags.Private);
if (info != null)
{
     if (info.FieldType.IsGenericType)
     {
         foreach (var subType in info.FieldType.GetGenericArguments())
         {
             if (subType.IsGenericParameter)
             {
                 Console.WriteLine( "The type of the field is generic" );
             }
         }
     }
}

試用

field.GetType().IsGenericType

Type.IsGenericType 屬性

獲取一個值,該值指示當前類型是否為泛型類型。

讓我以我理解的方式重新表述你的問題:

我有一個泛型類型,我想找出某個字段類型是否包含(其中一個)類型參數。 我怎么做?

如果要查明某個類型是否為泛型參數,可以使用IsGenericParameter屬性 這對T返回true ,但對List<T>返回。 如果你願意,你可以使用遞歸:

bool ContainsGenericParameter(Type fieldType)
{
    return fieldType.IsGenericParameter ||
        fieldType.GetGenericArguments().Any(t => ContainsGenericParameter(t));
}

例如,如果您有這樣的類型:

public class Holder<T>
{
   private T _t;
   private int _int;
   private List<T> _listT;
   private List<int> _listInt;
}

這個查詢

typeof(Holder<>)
    .GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
    .Select(f => new { f.Name, Generic = ContainsGenericParameter(f.FieldType) })

將返回如下內容:

Name     Generic
_t       True
_int     False
_listT   True
_listInt False

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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