Неявное приведение типов не происходит в дереве выражений

Я столкнулся со сценарием, в котором мне нужно отсортировать список настраиваемого типа по различным свойствам на основе ввода. С помощью нескольких статей я смог придумать общую реализацию с использованием LINQ. Во время модульного тестирования один из тестов завершился неудачно, потому что происходило неявное преобразование, когда lamda-выражение было создано с использованием дерева выражений.

Ниже я поместил пример кода для понимания проблемы (не уверен, почему форматирование не выполняется правильно, извините за это)

static class ExtensionMethods
{
 public static IEnumerable Sort(this IEnumerable unSortedList, Func selector, bool isAscending)
    {
       return isAscending ? unSortedList.OrderBy(selector) :                 unSortedList.OrderByDescending(selector);
}   
}

class Program
{

    class Student
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }

    static void Main(string[] args)
    {
        var unOrderedStudents = new List
                           {
                               new Student{ Name="A", Age=20},
                               new Student{Name = "B", Age=19}
                           };


        //This Works
        var sortUsingLamda = unOrderedStudents.Sort(stud => stud.Age, true);


        //Exception - Expression of type 'System.Int32' cannot be used for return type 'System.Object'
        var sortUsingExpressionTree = unOrderedStudents.Sort( GetSortFunc("Age"), true);

        Console.WriteLine("Press any key to continue");
        Console.ReadLine();
    }



    private static Func GetSortFunc(string sortColumn)
    {
        var param = Expression.Parameter(typeof(T), "entity");

        var propertyExpression = Expression.Property(param, sortColumn);

        var boxingExpression = Expression.Convert(propertyExpression, typeof(object));

        return Expression.Lambda>(propertyExpression, param).Compile();

        //after adding Convert expression issue got fixed
        //return Expression.Lambda>(boxingExpression, param).Compile();

    }
} 

В методе Main когда я пытаюсь передать делегат Func непосредственно методу расширения Sort, он работает, но не работает с деревом выражений.

Я обнаружил аналогичную проблему, но в ней говорится о параметрах ограниченного типа. Обе проблемы одинаковы? Может кто-нибудь помочь мне разобраться в проблеме.

6
задан VMAtm 31 May 2011 в 12:54
поделиться