确定字段是否为泛型类型

本文关键字:泛型类型 是否 字段 | 更新日期: 2023-09-27 18:05:22

是否可以通过反射确定字段是否为泛型类型?

如果可能的话,怎么做呢?

我想我的问题可能不够清楚,所以我现在正在编辑。

编辑:

如果a将有一个类型定义为如下示例,并且没有Holder<T>类型的实例,但只有System.Type实例通过System.Reflection.Assembly.GetTypesSystem.Reflection.FieldInfo实例检索描述字段_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" );
      }
 }

如果你想检查字段是否是泛型类定义中的泛型类型,那么你需要检查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" );
      }
 }

当然,您可以将这些组合起来。检查字段是否是泛型定义类中的类型的泛型,问题更大,但仍然可以做到。您只需要检查泛型类型的类型参数,看看其中一个是否设置了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" );
             }
         }
     }
}

Try out

field.GetType().IsGenericType

类型。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