我有下一个代码:
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;
}
答案 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)