获取List <object>数据的反射

时间:2018-03-29 09:00:51

标签: c# reflection

我正在尝试使用反射来遍历List中的DetailClass对象,就像字符串字段一样,但我无法弄清楚如何。

class DetailClass
{
    public string FieldDetail1 { get; set; }
    public string FieldDetail2 { get; set; }
    public string FieldDetail3 { get; set; }
}

class SomeClass
{
    public string Field1 { get; set; }
    public string Field2 { get; set; }
    public string Field3 { get; set; }
    public List<DetailClass> Artikli { get; set; }
}

private static PropertyInfo[] GetProperties(object obj)
{
    return obj.GetType().GetProperties();
}

var myData = new SomeClass();
var prop = GetProperties(myData);

foreach (var item in prop)
{
    if (item.PropertyType == typeof(string))
    {
        var name = item.Name,  
        var value = item.GetValue(myData).ToString()));
    }

    //how to get name and value for data inside List<DetailClass>?
}

3 个答案:

答案 0 :(得分:0)

  1. 您可以递归使用您的方法进入所有属性层
  2. 您可以查看是否 item.PropertyType.GetInterfaces().Contains(typeof(IEnumerable)) 如果为true,则转换(IEnumerable)item.GetValue(myData)并迭代结果 递归。

答案 1 :(得分:0)

就像TheDude回答的那样,你可以使用像这样的递归方法;

private void Recursion(object obj)
{
    var props = GetProperties(obj);
    foreach (var item in props)
    {
        if (item.PropertyType == typeof(string))
        {
            var name = item.Name;
            var value = item.GetValue(obj)?.ToString();
        }
        else if (item.PropertyType == typeof(List<DetailClass>))
        {
            var test = (List<DetailClass>) item.GetValue(obj);
            foreach (var t in test)
            {
                Recursion(t);
            }                    
        }
    }
}

使用列表中的名称和值做任何你想做的事。

答案 2 :(得分:0)

  1. 您试图枚举父类的属性
  2. GetValue需要对您正在处理的班级的引用
  3. <强>代码

    var myData = new SomeClass();
    myData.Artikli = new List<DetailClass>() { new DetailClass() { FieldDetail1 = "asd", FieldDetail2 = "sdfd", FieldDetail3 = "sdfsg" } };
    
    foreach (var obj in myData.Artikli)
    {
       foreach (var item in obj.GetType().GetProperties())
       {
          if (item.PropertyType == typeof(string))
          {
             var name = item.Name;
             var val = item.GetValue(obj);
             Console.WriteLine(name + ", " + val);
          }
       }
    }
    

    Demo Here

    其他资源

    PropertyInfo.GetValue Method (Object)

      

    返回指定对象的属性值。

         

    <强>参数

         
        
    • OBJ
    •   
    • 类型:System.Object      
          
      • 将返回其属性值的对象。
      •   
    •