У меня есть метод расширения, который сортирует ObservableCollection , используя динамическое свойство. Вот оригинальный код:
public static List<T> OrderByField<T>(this ObservableCollection<T> observableCollection, string sortField, string sortDirection)
{
// Sort the collection based on the name of the parameter.
IQueryable<T> queryable = observableCollection.AsQueryable();
string method = sortDirection == "Asc" ? "OrderBy" : "OrderByDescending";
var parameter = Expression.Parameter(queryable.ElementType, "p");
var property = Expression.Property(parameter, sortField);
var expression = Expression.Lambda(property, parameter);
Type[] types = new Type[] { queryable.ElementType, expression.Body.Type };
var methodCallExpression = Expression.Call(typeof(Queryable), method, types, queryable.Expression, expression);
return queryable.Provider.CreateQuery<T>(methodCallExpression).ToList();
}
Это прекрасно работает в моей отладочной сборке, но вылетает, когда я задаю ' Компилировать с цепочкой инструментов .Net Native * ' с сообщением:
Никакой универсальный метод 'OrderBy' для типа 'System.Linq.Queryable' не совместим с предоставленными аргументами и аргументами типа. Аргументы типа не должны предоставляться, если метод не является универсальным.
Дальнейшее тестирование показало, что если бы я вызывал методы 'OrderBy' явно, а не динамически, до того, как я выполнил динамический ' Expression.Call ', он работал бы с цепочкой инструментов .Net Native. настройка. Итак, я перевел метод к этому (это не исправление, это просто иллюстрирует проблему):
public static List<T> OrderByField<T>(this ObservableCollection<T> observableCollection, string sortField, string sortDirection)
{
// [HACK] This fixes it so that the call to Expression.Call doesn't crash.
IQueryable<T> queryable1 = new ObservableCollection<T>().AsQueryable();
Queryable.OrderBy<T, int>(queryable1, p => p.GetHashCode());
Queryable.OrderByDescending<T, int>(queryable1, p => p.GetHashCode());
// Sort the collection based on the name of the parameter.
IQueryable<T> queryable = observableCollection.AsQueryable();
string method = sortDirection == "Asc" ? "OrderBy" : "OrderByDescending";
var parameter = Expression.Parameter(queryable.ElementType, "p");
var property = Expression.Property(parameter, sortField);
var expression = Expression.Lambda(property, parameter);
Type[] types = new Type[] { queryable.ElementType, expression.Body.Type };
var methodCallExpression = Expression.Call(typeof(Queryable), method, types, queryable.Expression, expression);
return queryable.Provider.CreateQuery<T>(methodCallExpression).ToList();
}