如何从List <myclass>?</myclass>获取包含在MyClass中的特殊成员列表

时间:2011-06-14 17:27:58

标签: c# reflection

我有下一个代码:

public class MyClass
{
   object field1;
   object field2;
}

///////
List<MyClass> lst = new List<MyClass>();
GetLstMember(lst, "field1");

///////
List<object> GetLstMember(List<Object> lst, string memberName)
{
      List<object> rezult = new List<object>();

      for(int i=0; i<lst.Count; i++)
      {
           rezult.Add(lst[i].GetType().InvokeMember(
               memberName, 
               BindingFlag.GetProperty, 
               null,
               lst[i],
               null);
      }

      return rezult;
} 

是否有其他方法可以在不使用反射的情况下编写方法GetLstMember?我尝试使用BindingSource但没有成功:

BindingSource bs = new BindingSource(lst, memberName);
return bs.List;

好的,我理解使用反射。此类代码和之前的代码的性能是否存在差异:

List<object> GetLstMember(List<Object> lst, string memberName) 
{ 
     List<object> rezult = new List<object>(); 
     for (int i = 0; i < lst.Count; i++) 
       rezult.Add(lst[i].GetType().GetProperty(memberName).GetValue(lst[i],null)**); 
     return rezult; 
}

3 个答案:

答案 0 :(得分:1)

这是唯一的方法;这就是反思。

即使您使用BindingList,它也会使用反射 此外,BindingList实际上无法做到这一点。

答案 1 :(得分:1)

如果您在.net 4上运行,则可以使用dynamic关键字。 http://msdn.microsoft.com/en-us/library/dd264736.aspx

这样的事情应该有效。

public class MyClass {
    object field1;
    object field2;
}

///////
List<MyClass> lst = new List<MyClass>();
GetLstMember(lst);
///////
List<object> GetLstMember(List<dynamic> lst, string memberName)
{
      List<object> rezult=new List<object>();
      for(int i=0;i<lst.Count;i++){
            switch(memberName){
                case "field1":
                    rezult.Add(lst[i].field1);
                break;
                case "field2":
                    rezult.Add(lst[i].field2);
                break;          
            }
        }
    return rezult;
} 

答案 2 :(得分:0)

那么,

的性能是否存在差异
lst[i].GetType().GetProperty(memberName).GetValue(lst[i],null)

lst[i].GetType().InvokeMember(memberName, BindingFlag.GetProperty, null, lst[i], null)