使用未知属性名称从集合中获取值

时间:2016-11-25 08:49:50

标签: c#

首先,感谢您的关注和帮助!

消除故事,重点是

我有类似Car的集合,如下所示

public class Car {
     int a;
     int b;

     public Car()
     {
         a = b = 0;
     }

     public Car(int a, int b)
     {
         this.a = a;
         this.b = b;
     }

     public int A {
         set { a = value; }
         get { return a; }
     }

     public int B {
         set { b = value; }
         get { return b; }
     }
}


ObservableCollection<Car> carColl = new ObservableCollection<Car>();
carColl.Add(new Car(10, 100));
carColl.Add(new Car(20, 200));
carColl.Add(new Car(30, 300));

在我讲过这个故事的几个过程之后,我得到了一个属性名称'A','A'在名为 propertyNames List<string>中定义如下。

List<string> propertyNames = new List<string>();
propertyNames.Add("A");

现在,我想做下一步。

foreach (Car car in carColl)
{
    foreach (string propName in propertyNames)
    {
        // It is what I want to do. But car.propName don't work
        Console.WriteLine(car.propName);
    }
}

请让我知道怎么做... 非常感谢

4 个答案:

答案 0 :(得分:2)

你必须使用反射:

var properties = TypeDescriptor.GetProperties(typeof(Car));
foreach (Car car in carColl)
{
    foreach (string propName in propertyNames)
    {
        Console.WriteLine(properties[propName].GetValue(car));
    }
}

如果您不熟悉反射:使用反射可以访问对象的元信息(例如确切类型,属性名称,属性类型),否则这些信息将无法使用,因为它在编译期间被删除。使用该元信息,您可以访问您的对象,例如返回属性值或执行方法。

答案 1 :(得分:2)

它被称为&#34;反射&#34;。您的代码应如下所示:

foreach (Car car in carColl)
{
    foreach (string propName in propertyNames)
    {
          Console.WriteLine(typeof(Car).GetProperty(propName).GetValue(ent).ToString());
    }
}

在大多数情况下,使用反射是一个坏主意,因为它比普通代码更慢,类型更安全。例如,如果您尝试访问不存在的属性,则不会出现编译时错误。

答案 2 :(得分:1)

这是因为propName不是class car的属性。 您只能访问此类(car.A,car.B)中定义的属性

答案 3 :(得分:0)

我认为很明显你不能调用car.propName 因为您的Car构造函数不包含名为propName的字段(您可以调用A或B)。 我也永远看不到Car和你的名单之间的关系。

如果您的foreach最多只能执行汽车的迭代目的而已。

因此,如果我理解正确,您需要在Car构造函数中添加list参数,如

    public class Car {
     int a;
     int b;
     public List<string> propNames;

     public Car()
     {
         a = b = 0;
         propNames = new List<string>();
     }

     public Car(int a, int b)
     {
         this.a = a;
         this.b = b;
     }

     public int A {
         set { a = value; }
         get { return a; }
     }

     public int B {
         set { b = value; }
         get { return b; }
     }
}

之后,添加&#34; a&#34;在列表中,您需要指定要添加的汽车&#34; a&#34;。例如carColl [0] .propName.Add(&#34; a&#34;);

最后你可以通过

打印propName
foreach (Car car in carColl)
{    
    foreach (string propName in car.propNames)
    {
        // It is what I want to do. But car.propName don't work
        Console.WriteLine(propName);
    }
}