c# - 反射教學 - 如何知道PropertyInfo是否是一個集合




c#反射教學 (2)

下面是我用來獲取IsDirty檢查的類中所有公共屬性的初始狀態的一些代碼。

查看屬性是否為IEnumerable的最簡單方法是什麼?

乾杯,
Berryl

  protected virtual Dictionary<string, object> _GetPropertyValues()
    {
        return _getPublicPropertiesWithSetters()
            .ToDictionary(pi => pi.Name, pi => pi.GetValue(this, null));
    }

    private IEnumerable<PropertyInfo> _getPublicPropertiesWithSetters()
    {
        return GetType().GetProperties().Where(pi => pi.CanWrite);
    }

UPDATE

我最後做的是添加一些庫擴展,如下所示

    public static bool IsNonStringEnumerable(this PropertyInfo pi) {
        return pi != null && pi.PropertyType.IsNonStringEnumerable();
    }

    public static bool IsNonStringEnumerable(this object instance) {
        return instance != null && instance.GetType().IsNonStringEnumerable();
    }

    public static bool IsNonStringEnumerable(this Type type) {
        if (type == null || type == typeof(string))
            return false;
        return typeof(IEnumerable).IsAssignableFrom(type);
    }

https://code.i-harness.com


嘗試

private bool IsEnumerable(PropertyInfo pi)
{
   return pi.PropertyType.IsSubclassOf(typeof(IEnumerable));
}

我同意Fyodor Soikin,但是Enumerable的事實並不意味著它只是一個Collection,因為string也是Enumerable並且逐個返回字符......

所以我建議使用

if (typeof(ICollection<>).IsAssignableFrom(pi.PropertyType))






reflection