Подтвердить что ты не робот

Переключение значений в IEnumerable <> с использованием отражения

Учитывая объект, который может содержать IEnumerable<T>, как бы я мог проверить, что существует свойство IEnumerable<T>, и если это так, переберите все значения в этом IEnumerable<T> с помощью отражения для любого T?

4b9b3361

Ответ 1

foreach (var property in yourObject.GetType().GetProperties())
{
    if (property.PropertyType.GetInterfaces().Contains(typeof(IEnumerable)))
    {
        foreach (var item in (IEnumerable)property.GetValue(yourObject, null))
        {
             //do stuff
        }
    }
}

Ответ 2

Хорошо, вы можете протестировать его, как сказал Агилас, и после проверки и подтверждения как IEnumerable вы можете сделать что-то вроде этого:

public static bool IsEnumerable( object myProperty )
{
    if( typeof(IEnumerable).IsAssignableFrom(myProperty .GetType())
        || typeof(IEnumerable<>).IsAssignableFrom(myProperty .GetType()))
        return true;

    return false;
}

public static string Iterate( object myProperty )
{
    var ie = myProperty as IEnumerable;
    string s = string.Empty;
    if (ie != null)
    {
        bool first = true;
        foreach( var p in ie )
        {
            if( !first )
                s += ", ";
            s += p.ToString();
            first = false;
        }
    }
    return s;
}

foreach( var p in myObject.GetType().GetProperties() )
{
    var myProperty = p.GetValue( myObject );
    if( IsEnumerable( myProperty ) )
    {
        Iterate( myProperty );
    }
}