您好我基本上需要一个带有以下签名的功能
Expression<Func<T, object>> GetPropertyLambda(string propertyName)
我做了几次尝试,但是当房产可以为空时出现问题 它就像这样
ParameterExpression param = Expression.Parameter(typeof(T), "arg");
Expression member = Expression.Property(param, propertyName);
//this next section does conver if the type is wrong however
// when we get to Expression.Lambda it throws
Type typeIfNullable = Nullable.GetUnderlyingType(member.Type);
if (typeIfNullable != null)
{
member = Expression.Convert(member, typeIfNullable);
}
return Expression.Lambda<Func<T, object>>(member, param);
例外是
类型的表达 'System.Decimal' 不能用于返回类型 'System.Object的'
我真的会想到一些想法以及为什么这不能按预期工作
由于
答案 0 :(得分:8)
实际上我认为问题与Nullable类型无关,而是与值类型有关。尝试使用类型为decimal
(不是Nullable<decimal>
)的属性的方法:它会以同样的方式失败。
查看如何为值和引用类型生成表达式树(例如,使用LinqPad)
Expression<Func<T, object>> lambda = x => x.AString;
(参考类型)
=&GT;正文是MemberExpression
Expression<Func<T, object>> lambda = x => x.ADecimal;
(值类型)
=&GT;正文是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);