2015-03-13 3 views
1

Я хочу отсортировать List(Of MyDynamicObject) по его свойствам, где MyDynamicObject является ExpandoObject. У меня есть имена свойств как строки, поэтому мне нужно использовать какое-то отражение, чтобы передать их.Сортировка списка ExpanoObejct по свойствам с использованием отражения

Скажем, у меня есть список:

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 

ответ

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

решения Clever! Благодаря! –