迭代对象列表并使用字符串获取元素属性

时间:2014-03-24 10:52:43

标签: c# list loops object properties

我正在寻找解决这个问题的解决方案。

我有一个对象:

- 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

这可能吗?我需要一个解决方案,我花了很多时间,但在互联网上找不到任何解决方案。

2 个答案:

答案 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);
    }
}

如果该属性不存在,GetPropertyGetStringProperty方法会抛出ArgumentException

样本用法:

Person person = new Person {
    ID = "1",
    FirstName = "First",
    LastName = "Last",
    Age = 31            
};

Console.WriteLine(person.GetStringProperty("FirstName"));
Console.WriteLine(person.GetProperty<int>("Age"));