C# 确定字段是否为泛型类型

C# 确定字段是否为泛型类型,c#,.net,reflection,C#,.net,Reflection,是否可以通过反射确定字段是否为泛型 如果可能,怎么做 我想我的问题不够清楚,所以我现在正在编辑它 编辑: 如果a将具有如下示例中定义的类型,并且没有Holder类型的实例,而只有System.type实例通过System.Reflection.Assembly.GetTypes和System.Reflection.FieldInfo实例描述字段实例,如何确定_实例字段是否为泛型类型 public class Holder<T> { private T _instance; }

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

如果可能,怎么做

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

编辑:

如果a将具有如下示例中定义的类型,并且没有
Holder
类型的实例,而只有
System.type
实例通过
System.Reflection.Assembly.GetTypes
System.Reflection.FieldInfo
实例描述字段实例,如何确定_实例字段是否为泛型类型

public class Holder<T>
{
   private T _instance;
}
公共类持有者
{
私人T_实例;
}
试试看

field.GetType().IsGenericType
:

获取一个值,该值指示当前类型是否为泛型类型

试用

field.GetType().IsGenericType
:

获取一个值,该值指示当前类型是否为泛型类型


如果要知道字段本身是否为泛型类型,可以使用字段信息检查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" );
             }
         }
     }
}

如果要知道字段本身是否为泛型类型,可以使用字段信息检查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" );
             }
         }
     }
}

让我用我理解的方式重新表述你的问题:

我有一个泛型类型,我想知道某个字段类型是否包含(其中一个)类型参数。我该怎么做

如果要确定某个类型是否为泛型参数,可以使用。对于
T
,它返回
true
,但对于
列表
则不返回。如果需要,必须使用递归:

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;
}
Name     Generic
_t       True
_int     False
_listT   True
_listInt False

让我用我理解的方式重新表述你的问题:

我有一个泛型类型,我想知道某个字段类型是否包含(其中一个)类型参数。我该怎么做

如果要确定某个类型是否为泛型参数,可以使用。对于
T
,它返回
true
,但对于
列表
则不返回。如果需要,必须使用递归:

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;
}
Name     Generic
_t       True
_int     False
_listT   True
_listInt False


C#中没有泛型字段。你到底是什么意思?您的意思是如果字段的类型类似于
List
?或者仅仅是
List
(假设它是带有类型参数
T
)的泛型类型的一部分?@svick-假定字段的类型是泛型的
public class Foo{private Dictionary genericStringDictionary;…}
@tvanfosson,这是理解这个问题的一种方法,但我认为这不是唯一的方法。@svick:当我说“generic field”时,我指的是“generic type的field”,也就是说,如果field type是t.@Rest Wing,那么
List
,这也算吗?C#中没有泛型字段。你到底是什么意思?您的意思是如果字段的类型类似于
List
?或者仅仅是
List
(假设它是带有类型参数
T
)的泛型类型的一部分?@svick-假定字段的类型是泛型的
public class Foo{private Dictionary genericStringDictionary;…}
@tvanfosson,这是理解这个问题的一种方法,但我认为这不是唯一的方法。@svick:当我说“generic field”时,我指的是“generic type的field”,也就是说,如果field type是t.@Rest Wing,那么
List
,这也算吗?经过测试并考虑svick的评论,我发现我必须使用以下表达式
info.FieldType.IsGenericType | | info.FieldType.IsGenericParameter
。请编辑您的答案,以便我可以接受。@Rest我已更新,以反映对您的问题所做的更改,同时保留我的原始答案。@tvanfosson,您的第二个版本不计入
列表
,这似乎是Rest Wing想要的。@svick-您发表评论时,我正在添加组合。@tvanfosson,关于
List
?经过测试并考虑svick的评论,我发现我必须使用以下表达式
info.FieldType.IsGenericType | | info.FieldType.IsGenericParameter
。请编辑您的答案,以便我可以接受。@Rest我已更新,以反映对您的问题所做的更改,同时保留我的原始答案。@tvanfosson,您的第二个版本不计入
列表
,这似乎是Rest Wing想要的。@svick-您发表评论时,我正在添加组合。@tvanfosson,那么
列表
呢?