reflection用法 - c# reflection教學



通過反射確定屬性是否是一種數組 (4)

如何確定屬性是否是一種數組。

例:

public bool IsPropertyAnArray(PropertyInfo property)
{
    // return true if type is IList<T>, IEnumerable<T>, ObservableCollection<T>, etc...
}

Answer #1

如果你想知道屬性是否是一個數組,它實際上很容易:

property.PropertyType.IsArray;

編輯

如果你想知道它是否是一個實現IEnumerable的類型,就像所有“集合類型”一樣,它也不是很複雜:

return property.PropertyType.GetInterface("IEnumerable") != null;

Answer #2

對我來說,以下是行不通的,

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])

Answer #3

排除String類,因為它有資格作為集合,因為它實現了IEnumerable<char>

public bool IsPropertyACollection(this PropertyInfo property)
{
    return (!typeof(String).Equals(property.PropertyType) && 
        typeof(IEnumerable).IsAssignableFrom(property.PropertyType));
}

Answer #4
    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;
    }




reflection