Я столкнулся со сценарием, в котором мне нужно отсортировать список пользовательских типов по различным свойствам на основе входных данных. С помощью нескольких статей я смог придумать общую реализацию с использованием модульного тестирования LINQ.During. Один из тестов не удался, потому что неявное преобразование происходило при создании лямда-выражения с использованием дерева выражений.
Ниже я поместил пример кода, чтобы понять проблему (не уверен, почему форматирование не получалось правильным, извините за это)
static class ExtensionMethods
{
public static IEnumerable<TSource> Sort<TSource>(this IEnumerable<TSource> unSortedList, Func<TSource, object> 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<Student>
{
new Student{ Name="A", Age=20},
new Student{Name = "B", Age=19}
};
//This Works
var sortUsingLamda = unOrderedStudents.Sort<Student>(stud => stud.Age, true);
//Exception - Expression of type 'System.Int32' cannot be used for return type 'System.Object'
var sortUsingExpressionTree = unOrderedStudents.Sort<Student>( GetSortFunc<Student>("Age"), true);
Console.WriteLine("Press any key to continue");
Console.ReadLine();
}
private static Func<T, object> GetSortFunc<T>(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<Func<T, object>>(propertyExpression, param).Compile();
//after adding Convert expression issue got fixed
//return Expression.Lambda<Func<T, object>>(boxingExpression, param).Compile();
}
}
В методе Main, когда я пытаюсь передать делегат Func напрямую в метод расширения Sort, он работает, но не работает с деревом выражений.
Я обнаружил похожую проблему , но это говорит о параметрах ограниченного типа. Обе проблемы одинаковы? Может кто-нибудь помочь мне понять проблему.