C# 确定字段是否为泛型类型
是否可以通过反射确定字段是否为泛型 如果可能,怎么做 我想我的问题不够清楚,所以我现在正在编辑它 编辑: 如果a将具有如下示例中定义的类型,并且没有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; }
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,那么列表
呢?