Как я могу получить список специального члена, который в том числе в MyClass, из списка <MyClass>? - PullRequest
1 голос
/ 14 июня 2011

У меня есть следующий код:

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 ]

1 голос
/ 14 июня 2011

Если вы работаете в .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;
} 
1 голос
/ 14 июня 2011

Это единственный способ сделать это;это то, для чего используется отражение.

Даже если вы используете BindingList, он также будет использовать отражение.
Кроме того, BindingList на самом деле не может этого сделать.

0 голосов
/ 15 июня 2011

Итак, есть ли разница в производительности в

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...