30

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

4

2 回答 2

31
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
        }
    }
}
于 2012-09-26T19:04:28.397 回答
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 );
    }
}
于 2012-09-26T19:11:43.993 回答