Những câu trả lời từ Rob và Jon Skeet có một vấn đề.
Bạn nhận được một cái gì đó giống như x => Convert(x.PropertyName)
, nhưng thường ví dụ cho ASP.NET MVC bạn muốn một biểu hiện như thế này x => x.PropertyName
Vì vậy Expression.Convert
là "ô nhiễm" biểu thức đối với một số trường hợp.
Giải pháp:
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);
}
}
Cách sử dụng:
Expression<Func<T, DateTime>> expression = ...;
Expression<Func<T, object>> expr = expression.ToUntypedPropertyExpression();
@JonSkeet Expression.Convert không phải là luôn luôn là một ý tưởng tốt. Xem câu trả lời của tôi. – Rookian