Ответы от Rob и Jon Skeet есть одна проблема.
Вы получаете что-то вроде x => Convert(x.PropertyName)
, но часто, например, для ASP.NET MVC вы хотите выражение, как этот x => x.PropertyName
Так Expression.Convert
является «загрязняет» выражения для некоторых случаев.
Решение:
public static class LambdaExpressionExtensions
{
public static Expression<Func<TInput, object>> ToUntypedPropertyExpression<TInput, TOutput> (this Expression<Func<TInput, TOutput>> expression)
{
var memberName = ((MemberExpression)expression.Body).Member.Name;
var param = Expression.Parameter(typeof(TInput));
var field = Expression.Property(param, memberName);
return Expression.Lambda<Func<TInput, object>>(field, param);
}
}
Использование:
Expression<Func<T, DateTime>> expression = ...;
Expression<Func<T, object>> expr = expression.ToUntypedPropertyExpression();
@JonSkeet Expression.Convert не всегда хорошая идея. См. Мой ответ. – Rookian
Это генерирует тот же результат, что и выражение Expression> при объявлении x => x.TodayValue. В результате создается выражение, которое содержит метод «Преобразование()» в теле и выдает некоторые вещи, такие как Linq to Entities. Есть ли способ заставить его работать для такого сценария? Благодарю. –
CesarD
@CesarD: Боюсь, это не то, что я пытался сделать, поэтому мне нечего предлагать. –