Выражение типа «System.Func`2 [T, System.Boolean]» нельзя использовать для типа возвращаемого значения «System.Boolean» - PullRequest
0 голосов
/ 01 апреля 2020

Привет, у меня проблема с преобразованием моего выражения в Expression<Func<T, bool>>. Это возможно? Вызов Expression.Lambda вызывает ошибку Expression of type 'System.Func`2[T,System.Boolean]' cannot be used for return type 'System.Boolean', и это не имеет смысла для меня, так как я думал, что по определению у функции совпадающий тип возврата?

Expression expression = serializer.DeserializeText(serializedText);
ParameterExpression entityType = Expression.Parameter(typeof(T));
Expression<Func<T, bool>> typedExpression = Expression.Lambda<Func<T, bool>>(expression, entityType);

РЕДАКТИРОВАТЬ: выражение является сильным типизированный лямбда, например, s => idArray.Contains (s.SomeIntColumn), где s - это тип T. Затем выражение сериализуется с использованием сериализатора LINQ, а затем десериализуется в выражение System.Linq.Expression. Поскольку я знаю, что это функция типа T с возвращаемым значением bool, я хочу строго указать это.

1 Ответ

1 голос
/ 01 апреля 2020

Не уверен, что serializedText есть в вашем фрагменте, но пока это LambdaExpression, который возвращает boolean, вы сможете сделать следующее.

  Expression expression = Expression.Lambda(Expression.Constant(true), Expression.Parameter(typeof(string)));

  Expression<Func<string, bool>> typedExpression = (Expression<Func<string, bool>>)(expression);

  Console.WriteLine(typedExpression.Compile().Invoke("Hello"));

заменить string с вашим типом generi c.

В вашем примере, если serializedText можно десериализовать в Expression, сработает следующее, вам придется изменить его по вашим соображениям.

Expression<Func<T, bool>> typedExpression = (Expression<Func<T, bool>>)Expression.Lambda(
                                                                        serializer.DeserializeText(serializedText), 
                                                                        Expression.Parameter(typeof(T)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...