确定字段是否为泛型类型
本文关键字:泛型类型 是否 字段 | 更新日期: 2023-09-27 18:05:22
是否可以通过反射确定字段是否为泛型类型?
如果可能的话,怎么做呢?
我想我的问题可能不够清楚,所以我现在正在编辑。
编辑:如果a将有一个类型定义为如下示例,并且没有有Holder<T>
类型的实例,但只有System.Type
实例通过System.Reflection.Assembly.GetTypes
和System.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