我希望按其属性对List(Of MyDynamicObject)
进行排序,其中MyDynamicObject
为ExpandoObject
。我将属性名称作为字符串,因此我需要使用某种反射来传递它们。
假设我有一个清单:
MyList = New List(Of Entry)
其中Entry
有一个属性MyProperty_01
。
现在我想按对象属性MyList
对MyProperty_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
答案 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