循环IEnumerable中的值<>使用反射

时间:2012-09-26 18:49:50

标签: c# generics reflection

如果对象可能包含IEnumerable<T>,我将如何检查IEnumerable<T>属性是否存在,如果存在,则使用反射循环遍历IEnumerable<T>中的所有值T

2 个答案:

答案 0 :(得分:25)

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

答案 1 :(得分:7)

嗯,你可以像Aghilas所说的那样进行测试,一旦经过测试并确认为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 );
    }
}