【问题标题】:Iterate object list and get element property with a string迭代对象列表并使用字符串获取元素属性
【发布时间】:2014-05-01 16:28:29
【问题描述】:

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

我有一个对象:

- 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

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

【问题讨论】:

  • 你为什么要这样做?
  • 你应该使用反射,看看这个 SO question
  • @khillang 我正在阅读一个带有 ID 和属性名称的文本文件。我通过他们的 ID 获取人员(从文件中读取)并将他们放在一个列表中。然后我从该文件中读取属性名称(字符串)并遍历我已填充的列表并通过从文件中读取的字符串获取元素的属性值。
  • @AlessandroD'Andria:99.9999999% 可以通过反思解决的问题都是错误的方法。如果 OP 说出他真正想要做什么,我们可以帮助找到更好的方法。
  • @TimSchmelter 我不是反思的忠实拥护者,但是对于 OP 的要求,这是唯一的方法,但是您是对的,OP 必须后退几步并重新考虑它的问题.

标签: c# list loops object properties


【解决方案1】:

您可以使用反射通过名称获取属性的值:

foreach (Person p in persons)
{
    var personId = typeof(Person).GetProperty("ID").GetValue(p, null) as string;
}

当然,这需要一些错误处理和一些null 检查,但你明白了要点 :)

【讨论】:

  • 感谢您的回答。那么通过字符串获取属性值在c#中称为Reflection?
  • @y451n 是的。你可以阅读Type.GetPropertyhere
【解决方案2】:

正如其他答案所提到的,最简单的方法(尽管可能不是最好的方法)是使用反射。

我在以下类中包含了对基本数据类型和字符串的支持(并添加了一个附加属性来演示它如何用于基本数据类型):

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"));

【讨论】:

    猜你喜欢
    • 2021-11-28
    • 2020-04-16
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 2022-10-23
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多