通过反射确定属性是否是一种数组

本文关键字:一种 数组 是否是 反射 属性 | 更新日期: 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])