Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 迭代对象列表并使用字符串获取元素属性_C#_List_Loops_Object_Properties - Fatal编程技术网

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

C# 迭代对象列表并使用字符串获取元素属性,c#,list,loops,object,properties,C#,List,Loops,Object,Properties,我正在寻找解决这个问题的办法 我有一个目标: - Person (String ID, String FirstName, String LastName) 我得到了一张有几个人的名单 - List<Person> persons; 例如: 我想知道列表中人员的ID: 我可以这样做: foreach(Person p in persons) { String personId = p.ID; } 但我想这样做: foreach(Person p in persons)

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

我有一个目标:

- Person (String ID, String FirstName, String LastName)
我得到了一张有几个人的名单

- List<Person> persons;
例如:

我想知道列表中人员的ID:

我可以这样做:

foreach(Person p in persons)
{
    String personId = p.ID;
}
但我想这样做:

foreach(Person p in persons)
{
    String personId = p. + "ID";
}
我想附加字符串
“ID”
以获取该元素的ID,而不是调用
p.ID


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

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

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

当然,这需要一些错误处理和一些
null
检查,但是您得到了要点:)

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

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


你为什么要这样做?你应该使用反射,看看这个。@khellang我正在读一个带有ID和属性名的文本文件。我通过他们的ID(从文件中读取)获取这些人,并将他们放入列表中。然后,我从该文件中读取属性名称(字符串),并遍历已填充的列表,然后通过从该文件中读取的字符串获取元素的属性值。@AlessandroD'Andria:99.9999999%可以通过反射解决的所有问题都是错误的方法。如果OP能说出他真正想做的事情,我们可以帮助找到更好的方法。@TimSchmelter我不太喜欢反思,但对于OP的要求,这是唯一的方法,但你是对的,OP必须后退几步,重新思考问题。谢谢你的回答。因此,在c#?@y451n Yes中,通过字符串获取属性值称为反射。您可以阅读关于
Type.GetProperty
foreach (Person p in persons)
{
    var personId = typeof(Person).GetProperty("ID").GetValue(p, null) as string;
}
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);
    }
}
Person person = new Person {
    ID = "1",
    FirstName = "First",
    LastName = "Last",
    Age = 31            
};

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