【问题标题】:Loop over values in an IEnumerable<> using reflection使用反射循环遍历 IEnumerable<> 中的值
【发布时间】:2012-09-26 18:49:49
【问题描述】:

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

【问题讨论】:

  • "可能包含一个 IEnumerable" ... 那么除了 IEnumerable 之外的其他选项到底是什么?
  • 您想要达到的目标是什么?所有这些类型都是你定义的类型吗?
  • @JaneDoe 它可以包含任何东西...字符串、int、IEnumerables等
  • @KirillBestemyanov 我不认为目标很重要所以我没有提到它,但既然它是......我想接受任何对象并吐出一个逗号分隔的列表所有值,无论是分配给字符串、整数还是 IEnumerables
  • @JaneDoe 我不想...我只想遍历 IEnumerables

标签: c# generics reflection


【解决方案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
        }
    }
}

【讨论】:

  • 差不多。 IEnumerable 上的 &lt;&gt; 松散,我想。它是向后兼容的接口,并且始终存在,IIRC。但是请注意,使用 var 时,object 只是一个同义词
  • 非常感谢!我唯一需要改变的是 if (property.GetType()...if (property.PropertyType....
  • 请注意,String 之类的类实现了 IEnumerable,因此您可能无法始终获得预期的结果(除非您想要一个 char 数组...)
  • @sehe var item in (IEnumerable&lt;&gt;)propertyInfo.GetValue(model) 给了我“意外使用未绑定的泛型名称”,var item in (IEnumerable)propertyInfo.GetValue(model) 给了我“使用泛型类型 'IEnumerable 需要 1 个类型参数'”...不是确定我应该实施什么?
  • 如果有人在我上面的评论中收到错误,您需要包括System.Collections,而不仅仅是像我一样的System.Collections.Generic :) 然后你可以使用var item in (IEnumerable)propertyInfo.GetValue(model)
【解决方案2】:

好吧,您可以按照 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 );
    }
}

【讨论】:

  • 很高兴刚才对我的回答投反对票的人解释了他/她为什么这样做而不是仅仅投反对票,否则它不会为讨论增加任何有价值的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-02
  • 1970-01-01
  • 2021-11-22
相关资源
最近更新 更多