Параметр .NET Native Toolchain вызывает сбой приложения Магазина Windows - PullRequest
0 голосов
/ 19 июня 2019

У меня есть метод расширения, который сортирует 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();
        }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...