C#反射和获取属性

23

我有以下虚拟类结构,我试图找出如何从PeopleList中的每个People实例获取属性。我知道如何从单个People实例获取属性,但却无法想出如何从PeopleList获取它。我相信这真的很简单,但可以有人指点我方向吗?

public class Example
{
    public class People
    {
        private string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        private int _age;
        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }

        public People()
        {

        }

        public People(string name, int age)
        {
            this._name = name;
            this._age = age;
        }
    }

    public class PeopleList : List<People>
    {
        public static void DoStuff()
        {
             PeopleList newList = new PeopleList();

            // Do some stuff

             newList.Add(new People("Tim", 35));
        }
    }        
}

1
看看这篇帖子:https://dev59.com/UkfRa4cB1Zd3GeqP-ZUF - jjxtra
你是说你从PeopleList拿不到它们吗?除了标准的CountCapacity之外,你的示例中没有任何属性... - John Rasch
不太确定您的意思。是否有不同的类可以继承自“People”,并且您想要获取这些属性,还是仅希望获取列表中各项的各种值(如果是这样,我不明白为什么需要反射)。您能否添加一个示例,说明您打算如何使用这些数据(伪代码就足够了)。 - Grant Peters
为什么你需要使用反射来完成这个? - Pierreten
我不认为你错过了什么,只是我还在学习泛型,才刚开始接触一年半。 - Nathan
显示剩余2条评论
1个回答

41

如果您还不确定您需要什么,这段快速的代码(未经测试)可能会让您走上正确的轨道(或者至少帮助澄清您想要什么)。

void ReportValue(String propName, Object propValue);

void ReadList<T>(List<T> list)
{
  var props = typeof(T).GetProperties();
  foreach(T item in list)
  {
    foreach(var prop in props)
    {
      ReportValue(prop.Name, prop.GetValue(item));
    }
  }
}

c#应该能够自动识别'PeopleList'继承自'List'并正常处理,但如果您需要将'PeopleList'作为泛型类型,则可以使用以下方法:

void ReadList<T>(T list) where T : System.Collections.IList
{
  foreach (Object item in list)
  {
    var props = item.GetType().GetProperties();
    foreach (var prop in props)
    {
      ReportValue(prop.Name, prop.GetValue(item, null));
    }
  }
}

请注意,这实际上也将处理列表中派生类型中的属性。

这几乎就是我想要做的。然而,如果(List<T> list)变成了(T obj),其中T是PeopleList,你会如何处理呢?或者这不是正确的方法?使用(List<T> list)是否更好?这就是我正在苦苦思考的问题。 - Nathan
@Nathan - 你可以直接使用 IEnumerable<T>,因为我猜测PeopleListIEnumerable<Person> - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接