2009-08-26 2 views
1

Я читал книгу, которая находится на C#. Я разработчик VB.NET (и очень младший), и у меня много проблем со следующим кодом, который содержит много вещей, которые я никогда раньше не видел. У меня есть базовые знания о лямбда-выражениях.Что делает этот код в мире? (C#)

public List<T> SortByPropertyName(string propertyName, bool ascending) 
{ 
    var param = Expression.Parameter(typeof(T), "N"); 

    var sortExpression = Expression.Lambda<Func<T, object>> 
     (Expression.Convert(Expression.Property(param, propertyName), 
     typeof(object)), param); 

    if (ascending) 
    { 
     return this.AsQueryable<T>().OrderBy<T, object>(sortExpression).ToList<T>(); 
    } 
    else 
    { 
     return this.AsQueryable<T>().OrderByDescending<T, object>(sortExpression).ToList<T> 
    } 
} 

Может ли кто-нибудь осветить меня относительно того, что делает этот код и какие понятия используются? Я также пытаюсь преобразовать этот код в VB.NET с небольшой удачей, поэтому любая помощь там будет оценена.

+1

ли меня, или сломана код? Где Т определено? –

+1

@Mike: Я предполагаю, что это в общем классе, возможно, что-то, что наследуется от List . –

ответ

3

В целом код сортирует что-то (предположительно список?) Указанным именем свойства в порядке возрастания или убывания. В этом классе уже должен быть общий тип T.

Код создает новый ParameterExpression, вызывая Expression.Parameter, а затем передает этот параметр в функцию Expression.Lambda, которая создает новое выражение лямбда.

Это выражение используется для сортировки списка, вызвав OrderBy или OrderByDescending функции (выбор в зависимости от параметра ascending) и возвращает отсортированный список как новый List<T>.

Я не сейчас перед Visual Studio, но это должен быть достаточно близкий перевод на VB для вас.

Public Function SortByPropertyName(ByVal propertyName as String, ByVal ascending as Boolean) as List(Of T) 
    Dim param = Expression.Parameter(GetType(T), "N") 

    Dim sortExpression = Expression.Lambda(Of Func(Of T, Object))(Expression.Convert(Expression.Property(param, propertyName), GetType(Object)), param) 

    If ascending Then 
     return Me.AsQueryable(Of T).OrderBy(Of T, Object)(sortExpression).ToList() 
    Else 
     return Me.AsQueryable(Of T).OrderByDescending(Of T, Object)(sortExpression).ToList() 
    End If 
End Function 
+0

Спасибо за ответ Адам. Основная проблема, с которой я столкнулся, - это следующая строка: var sortExpression = Expression.Lambda > (Expression.Convert (Expression.Property (param, propertyName), typeof (object)), param); Что делает > сделать? Говорит ли он, что общая функция будет возвращена Expression.Lambda()? – Andrew

+0

Хм ... VS2008, похоже, не нравится: "return Me.AsQueryable (Of T) .OrderBy (Of T, Object) (sortExpression) .ToList()" Я пробовал: Return Queryable.AsQueryable (Of T) (Me) .OrderBy (sortExpression) .ToList() и, похоже, это так, хотя я не уверен, что он делает то же самое! – Andrew

Смежные вопросы