首先,感谢您的关注和帮助!
消除故事,重点是
我有类似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);
}
}
请让我知道怎么做... 非常感谢
答案 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;);
最后你可以通过
打印propNameforeach (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);
}
}