[英]Determine whether field is of generic type or not
是否可以通过反射确定字段是否属于泛型类型?
如果可能,怎么做?
我想我的问题不够清楚,所以我现在正在编辑它。
编辑:
如果 a 将具有如下示例中定义的类型并且没有Holder<T>
类型的实例,但只有通过System.Reflection.Assembly.GetTypes
和System.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" );
}
}
}
}
让我以我理解的方式重新表述你的问题:
我有一个泛型类型,我想找出某个字段类型是否包含(其中一个)类型参数。 我怎么做?
如果要查明某个类型是否为泛型参数,可以使用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.