通过IEnumerable或PropertyInfo []使用Reflection Foreach

时间:2015-02-16 20:36:46

标签: c#

我从未使用过Reflection,但我认为这种情况在没有过于昂贵的过程中会有用。我有五个不同的List< .object>其中每个都有不同的属性,我有一个WebMethod,它只返回这些类型的List< .object>中的一个基于switch语句,并将结果列表传递给应该迭代值并写入的方法将它们传递给传递回WebMethod的StringBuilder。我不想写五种不同的方法来迭代每个对象并写出字符串。

通过SO查看导致此代码作为该方法的良好开端(下面),但是,我不了解在此之后获得我需要的最佳方法。我尝试使用PropertyInfo [],但在投射对象时抛出了错误。 IEnumerable并没有抛出错误,但我似乎无法访问这些值。

private StringBuilder generateString<T>(T obj) where T : class
{
    //Trying to use PropertyInfo[] example
    Type type = obj.GetType();
    PropertyInfo[] properties = type.GetProperties();
    foreach(PropertyInfo p in properties)
        sb.Append("{0},{1}", p.Name, p.GetValue(obj,null));

   //Trying to use IEnumerable example
   IEnumerable enumerable = (IEnumerable)obj; 
   foreach(var x in enumerable)
        sb.Append(x);

}

当我尝试查看PropertyInfo []数组中的值时,它向我显示它有三个项目,最后一个是我的对象类型,但我似乎无法找到任何实际值。它抛出两个错误TargetParameterCountException和TargetInvocationException。

但是,当我查看x的IEnumerable数据时,它会向我显示我期望看到的内容,除非我认为可以访问各个部分的格式,例如:

x
 {Base.DataType.MyObject}
    Age: 24
    Name: Helen Smith
    Cost: 24.00
    Date: 2/25/2012

尝试访问此数据的正确方法是什么?我该如何正确地做到这一点?

3 个答案:

答案 0 :(得分:2)

您似乎正在传递IEnumerable,而不是单个对象。如果您需要迭代对象并分别获取每个项目和属性的类型:

if(obj is IEnumerable)
{
     foreach(var item in (IEnumerable)obj)
     {
          Type type = item.GetType();
          PropertyInfo[] properties = type.GetProperties();
          foreach(PropertyInfo p in properties)
              sb.Append("{0},{1}", p.Name, p.GetValue(item,null));
     } 
}

答案 1 :(得分:0)

如果所有对象都具有相同的类型,我相信你正在做的事情。你传递的是List<T>,你可以得到这样的项目类型:

var listType = obj.GetType();
var itemType = listType.GetElementType();

如果您传入itemType,那么MyObject List<MyObject>即可。从那里你应该能够像GetProperties一样。

如果列表是异构的,那么您需要循环访问并获取每个项目的属性,如@ Selman22的答案。

答案 2 :(得分:0)

您到底访问数据的最佳方式究竟是什么意思?您只是尝试访问StringBuilder对象中的内容,还是只需要以某种形式输出信息?

我过去使用反射来获取名称和值的方式如下:

public StringBuilder generateString(List<object> objList)
{
    StringBuilder sb = new StringBuilder();
    int itemNumber = 0;
    foreach(var obj in objList)
    {
        foreach (var prop in obj.GetType().GetProperties())
        {
              // i used the new line characters to increase readability for 
              // output to a console so just ignore them.
              sb.Append("Item " + itemNumber);
              sb.Append("\n");
              sb.Append(prop.Name + ", " + prop.GetValue(obj, null));            
              sb.Append("\n");
         }
    }
    return sb;
}

查看此字符串构建器对象的输出,我看到了:

第1项

Property1,value

Property2,值

Property3,value

第2项

Property1,value

Property2,值

Property3,价值 等...

我希望这有助于你。