我正在寻找解决这个问题的解决方案。
我有一个对象:
- Person (String ID, String FirstName, String LastName)
我找到了一个包含Persons
- List<Person> persons;
我的目标是:
1. Iterate through List
2. Get property value from that element with a string named to that property
例如:
我想知道列表中人员的ID:
我可以这样做:
foreach(Person p in persons)
{
String personId = p.ID;
}
但我想做这样的事情:
foreach(Person p in persons)
{
String personId = p. + "ID";
}
我想追加字符串"ID"
以获取该元素的ID,而不是调用p.ID
。
这可能吗?我需要一个解决方案,我花了很多时间,但在互联网上找不到任何解决方案。
答案 0 :(得分:5)
您可以使用反射按名称获取属性的值:
foreach (Person p in persons)
{
var personId = typeof(Person).GetProperty("ID").GetValue(p, null) as string;
}
当然这需要一些错误处理和一些null
检查,但你得到了要点:)
答案 1 :(得分:1)
正如其他答案所提到的,最简单的方法(虽然可能不是最好的方法)是使用反射。
我在下面的类中包含了对基本数据类型和字符串的支持(并添加了一个附加属性来演示如何将它用于基本数据类型):
public class Person {
public string ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
private PropertyInfo GetProperty(string name) {
PropertyInfo property = GetType().GetProperty(name);
if (property == null) {
throw new ArgumentException(string.Format("Class {0} doesn't expose a {1} property", GetType().Name, name));
}
return property;
}
public string GetStringProperty(string name) {
var property = GetProperty(name);
return (string) property.GetValue(this, null);
}
public T GetProperty<T>(string name) {
var property = GetProperty(name);
return (T) property.GetValue(this, null);
}
}
如果该属性不存在,GetProperty
和GetStringProperty
方法会抛出ArgumentException
。
样本用法:
Person person = new Person {
ID = "1",
FirstName = "First",
LastName = "Last",
Age = 31
};
Console.WriteLine(person.GetStringProperty("FirstName"));
Console.WriteLine(person.GetProperty<int>("Age"));