IT이야기

PropertyInfo가 컬렉션인지 확인하는 방법

cyworld 2021. 10. 21. 21:25
반응형

PropertyInfo가 컬렉션인지 확인하는 방법


다음은 IsDirty 검사를 위해 클래스에 있는 모든 공용 속성의 초기 상태를 가져오는 데 사용하는 몇 가지 코드입니다.

속성이 IEnumerable인지 확인하는 가장 쉬운 방법은 무엇입니까?

건배,
베릴

  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);
    }

업데이트

내가 한 일은 다음과 같이 몇 가지 라이브러리 확장을 추가하는 것이 었습니다.

    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);
    }

if ( typeof( IEnumerable ).IsAssignableFrom( pi.PropertyType ) )

나는 Fyodor Soikin에 동의하지만 문자열도 Enumerable이고 문자를 하나씩 반환하기 때문에 Enumerable이라는 사실이 그것이 Collection일 뿐이라는 의미는 아닙니다...

그래서 나는 사용하는 것이 좋습니다

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

노력하다

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

ReferenceURL : https://stackoverflow.com/questions/3569811/how-to-know-if-a-propertyinfo-is-a-collection

반응형