2015-03-13 33 views
1

我想按其属性排序List(Of MyDynamicObject),其中MyDynamicObjectExpandoObject。我有属性名称作为字符串,所以我需要使用某种反射来传递它们。对使用​​反射的属性对ExpanoObejct的列表进行排序

比方说,我有一个列表:

MyList = New List(Of Entry) 

其中Entry有一个属性MyProperty_01
现在我想按对象属性MyProperty_01排序MyList

在静态对象和无反射的情况下,我会做这样的事情的:

MyList = MyList.OrderBy(Function(x) x.MyProperty_01).ToList 

现在,如果我需要通过属性的字符串名字,我可以这样做:

Dim MyPropertyName As String = "MyProperty_01" 
MyList = MyList.OrderBy(Function(x) GetType(Entry).GetProperty(MyPropertyName).GetValue(x)).ToList 

其中Entry是对象类的参考。

我该如何用ExpandoObject做到这一点?如果是ExpandoObject,我没有类参考。

所以这不起作用了。

Dim MyPropertyName As String = "MyProperty01" 
MyList = MyList.OrderBy(Function(x) GetType().GetProperty(MyPropertyName).GetValue(x)).ToList 

回答

1

这是一种可能的方式,但不使用反射。由于ExpandoObject实现IDictionary(Of String, Object).Item接口,可以通过属性名字符串投的对象来表示接口类型和访问属性,就像你在相应的字符串键从字典访问值:

Dim MyPropertyName As String = "MyProperty01" 
MyList = MyList.OrderBy(Function(x) CType(x, IDictionary(Of String, Object))(MyPropertyName)).ToList 
+0

聪明的解决方案!谢谢! – 2015-03-13 09:59:38

相关问题