На самом деле я не думаю, что проблема связана с типами Nullable, а скорее с типами значений. Попробуйте свой метод со свойством типа decimal
(не Nullable<decimal>
): он не сможет работать так же.
Посмотрите, как создаются деревья выражений для значений и ссылочных типов (например, с использованием LinqPad)
Expression<Func<T, object>> lambda = x => x.AString;
(ссылочный тип)
=> Тело это MemberExpression
Expression<Func<T, object>> lambda = x => x.ADecimal;
(тип значения)
=> Тело является UnaryExpression
с NodeType = Convert
и Type = typeof(object)
, а его Operand
является MemberExpression
Я немного изменил ваш метод, чтобы учесть это, и, похоже, он работает нормально:
ParameterExpression param = Expression.Parameter(typeof(T), "arg");
Expression member = Expression.Property(param, propertyName);
if (member.Type.IsValueType)
{
member = Expression.Convert(member, typeof(object));
}
return Expression.Lambda<Func<T, object>>(member, param);