如何知道PropertyInfo是否是一个集合

Ber*_*ryl 58 c# reflection

下面是我用来获取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);
    }
Run Code Online (Sandbox Code Playgroud)

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);
    }
Run Code Online (Sandbox Code Playgroud)

Fyo*_*kin 62

if ( typeof( IEnumerable ).IsAssignableFrom( pi.PropertyType ) )
Run Code Online (Sandbox Code Playgroud)

  • 请注意,字符串也是IEnumerable (40认同)
  • 更好:p.PropertyType!= typeof(string)&& typeof(IEnumerable).IsAssignableFrom(p.PropertyType) (8认同)

sst*_*oss 13

我同意Fyodor Soikin,但是Enumerable的事实并不意味着它只是一个集合,因为字符串也是Enumerable并且逐个返回字符......

所以我建议使用

if (typeof(ICollection<>).IsAssignableFrom(pi.PropertyType))
Run Code Online (Sandbox Code Playgroud)


Ste*_*ner 7

尝试

private bool IsEnumerable(PropertyInfo pi)
{
   return pi.PropertyType.IsSubclassOf(typeof(IEnumerable));
}
Run Code Online (Sandbox Code Playgroud)

  • 我最近注意到如果 x == y,`x.IsSubClassOf(y)` 将返回 false。在这种情况下,如果该属性碰巧实际上是“IEnumerable”类型,则该函数将返回 false。 (3认同)