使用反射按属性对ExpanoObejct列表进行排序

时间:2015-03-13 08:34:06

标签: vb.net reflection expandoobject

我希望按其属性对List(Of MyDynamicObject)进行排序,其中MyDynamicObjectExpandoObject。我将属性名称作为字符串,因此我需要使用某种反射来传递它们。

假设我有一个清单:

MyList = New List(Of Entry)

其中Entry有一个属性MyProperty_01
现在我想按对象属性MyListMyProperty_01进行排序。

如果是静态物体而没有反射,我会做这样的事情:

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 个答案:

答案 0 :(得分: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