【问题标题】:C# - Use Reflection to Extract List of Values from a List<Class>C# - 使用反射从 List<Class> 中提取值列表
【发布时间】:2016-03-15 08:51:33
【问题描述】:

我有一个包含一个类的列表,并且希望能够使用反射来遍历该类中的每个属性并生成一个包含每个属性值的列表。我使用反射来获取所有属性没有问题,但我失败的地方在于迭代提取每个属性值列表的语法。

示例代码:

public class ExampleClass
{
    public double Val1 {get; set;}
    public double Val2 { get; set; }
    public double Val3 { get; set; }

    public ExampleClass(double val1, double val2, double val3)
    {
        this.Val1 = val1;
        this.Val2 = val2;
        this.Val3 = val3 ;
    }
}

public class Main
{
    public Main()
    {
        List<ExampleClass> exampleList = new List<ExampleClass>();

        exampleList.Add(new ExampleClass(1.1, 1.2, 1.3));
        exampleList.Add(new ExampleClass(2.1, 2.2, 2.3));
        exampleList.Add(new ExampleClass(3.1, 3.2, 3.3));


        List<PropertyInfo> properties = exampleList[0]
            .GetType()
            .GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)
            .ToList();

        foreach (PropertyInfo prop in properties)
        {
            // Extract each property into a list, e.g.
            // 1st pass: list containing 1.1, 2.1, and 3.1
            // 2nd pass: list containing 1.2, 2.2 and 3.2
            // 3rd pass: list containing 1.3, 2.3 and 3.3
        }
    }
}

如果我要手动指定我想要的属性,我可以使用这样的东西:

var test = exampleList.Select(X => X.Val1).ToList();

不幸的是,我的最佳猜测如下所示,并生成“对象引用未设置为对象的实例”错误

var test1 = collectionCompletionList.GetType().GetProperty(prop.Name).GetValue(collectionCompletionList, null);

我在这里缺少什么(大概)简单的东西?

【问题讨论】:

    标签: c# generics reflection collections


    【解决方案1】:

    你几乎明白了。 PropertyInfo 类的 GetValue 方法接受其属性值将作为参数返回的对象。因此,您需要将列表中的项目而不是列表本身传递给它。

    foreach (PropertyInfo prop in properties) {
        var propertiesValues = exampleList.Select(o => prop.GetValue(o)).ToList();
    }
    

    【讨论】:

      【解决方案2】:

      您应该迭代集合和属性。

      Dictionary<string, ArrayList> allIterationValues = new Dictionary<string, ArrayList>();
      
      foreach (PropertyInfo prop in properties)
      {
          ArrayList iterationList = new ArrayList();
          allIterationValues.Add(prop.Name, iterationList);
      
          foreach (var element in exampleList)
          {
              iterationList.Add(prop.GetValue(element, null));
          }
      }
      // Check the value of allIterationValues here
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-04
        • 2012-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多