C# 反射和获取属性

Posted

技术标签:

【中文标题】C# 反射和获取属性【英文标题】:C# Reflection and Getting Properties 【发布时间】:2011-02-15 07:01:56 【问题描述】:

我有以下虚拟类结构,我试图找出如何从 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));
        
            

【问题讨论】:

看这个帖子:***.com/questions/862783/… 您无法从PeopleList 获取它们是什么意思?除了标准CountCapacity 之外,您的示例中没有其他属性... 不太清楚你的意思。是否有可能从People 继承的不同类,并且您想获取这些属性,或者您只是想获取列表中项目的各种值(如果是这样,我不明白您为什么需要对此进行反思)。您能否添加一个您打算如何使用这些数据的示例(伪代码应该足够好)。 为什么需要重新选举? 抱歉,这不是一个经过深思熟虑的例子。我打算做的,这也可能是错误的,是有一个通用的方法,我将 PeopleList 传入,T 可以是 PeopleList。然后我将遍历 PeopleList 的每个实例,获取 People 的属性及其值。 T 可以是从 List 继承的任何类。我希望这会有所帮助? 【参考方案1】:

仍然不能 100% 确定您想要什么,但是这段快速的代码(未经测试)可能会让您走上正确的轨道(或者至少有助于阐明您想要什么)。

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 list) 是 (T obj) 而 T 是 PeopleList,你会怎么做?或者这不是要走的路?使用 (List list) 会更好吗?这就是我正在努力解决的问题。 @Nathan - 你可以使用IEnumerable&lt;T&gt;,因为我猜测 PeopleListIEnumerable&lt;Person&gt;

以上是关于C# 反射和获取属性的主要内容,如果未能解决你的问题,请参考以下文章

C# 反射和获取属性

c# 如何通过反射 获取属性值

C# 反射之属性操作

如何更改通过反射 C# 获取的属性值

.Net C# 反射,了解只需3分钟

c# 如何通过反射 获取设置属性值