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