通过反射确定属性是否是一种数组
本文关键字:一种 数组 是否是 反射 属性 | 更新日期: 2023-09-27 18:25:38
如何确定属性是否是一种数组。
示例:
public bool IsPropertyAnArray(PropertyInfo property)
{
// return true if type is IList<T>, IEnumerable<T>, ObservableCollection<T>, etc...
}
您似乎在问两个不同的问题:一个类型是数组(例如string[]
)还是任何集合类型。
对于前者,只需检查property.PropertyType.IsArray
。
对于后者,你必须决定你希望一个类型符合什么样的最低标准。例如,你可以使用typeof(IEnumerable).IsAssignableFrom(property.PropertyType)
来检查非泛型IEnumerable
。如果您知道T的实际类型,例如typeof(IEnumerable<int>).IsAssignableFrom(property.PropertyType)
,您也可以将其用于通用接口。
在不知道T的值的情况下检查通用IEnumerable<T>
或任何其他通用接口可以通过检查property.PropertyType.GetInterface(typeof(IEnumerable<>).FullName)
是否不是null
来完成。请注意,我在该代码中没有为T
指定任何类型。你可以对IList<T>
或任何其他你感兴趣的类型做同样的事情。
例如,如果您想检查通用IEnumerable<T>
:,可以使用以下内容
public bool IsPropertyACollection(PropertyInfo property)
{
return property.PropertyType.GetInterface(typeof(IEnumerable<>).FullName) != null;
}
数组还实现了IEnumerable,因此它们也将从该方法返回true
。
排除String
类,因为它符合集合的条件,因为它实现了IEnumerable<char>
。
public bool IsPropertyACollection(this PropertyInfo property)
{
return (!typeof(String).Equals(property.PropertyType) &&
typeof(IEnumerable).IsAssignableFrom(property.PropertyType));
}
如果你想知道属性是否是一个数组,其实很容易:
property.PropertyType.IsArray;
编辑
如果你想知道它是否是一个实现IEnumerable的类型,就像所有"集合类型"一样,它也不是很复杂:
return property.PropertyType.GetInterface("IEnumerable") != null;
public static bool IsGenericEnumerable(Type type)
{
return type.IsGenericType &&
type.GetInterfaces().Any(
ti => (ti == typeof (IEnumerable<>) || ti.Name == "IEnumerable"));
}
public static bool IsEnumerable(Type type)
{
return IsGenericEnumerable(type) || type.IsArray;
}
对我来说,以下内容不起作用,
return property.PropertyType.GetInterface(typeof(ICollection<>).FullName) != null;
以下正在工作,
typeof(ICollection<>).IsAssignableFrom(property.PropertyType.GetGenericTypeDefinition())
这是检查ICollection<IInterface>
或ICollection<BaseClassInTree>
的快捷方式
var property = request as PropertyInfo;
property.PropertyType.IsGenericType && (typeof(ICollection<>).IsAssignableFrom(property.PropertyType.GetGenericTypeDefinition())) && typeof().IsAssignableFrom(property.PropertyType.GenericTypeArguments[0])