Я столкнулся со сценарием, в котором мне нужно отсортировать список настраиваемого типа по различным свойствам на основе ввода. С помощью нескольких статей я смог придумать общую реализацию с использованием 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, он работает, но не работает с деревом выражений.
Я обнаружил аналогичную проблему, но в ней говорится о параметрах ограниченного типа. Обе проблемы одинаковы? Может кто-нибудь помочь мне разобраться в проблеме.