我有一个问题,在某些情况下(似乎是属性类型为bool),lambda表达式用于引用属性。我用它来得名;问题是有时候表达式被修改为有一个额外的Convert()函数。
e.g。
GetPropertyName<TSource>(Expression<Func<TSource, object>> propertyLambda) {...}
var str = GetPropertyName<MyObject>(o=>o.MyBooleanProperty);
发生了什么事情,propertyLambda看起来像Convert(o.MyBooleanProperty)
而不是o.MyBooleanProperty
,我期待。
答案 0 :(得分:3)
添加了Convert
,因为o.MyBooleanProperty
是bool
,但结果必须是对象。如果你的方法在源对象类型和结果类型中都是通用的,那么就没有Convert
:
GetPropertyName<TSource, TResult>(Expression<Func<TSource, TResult>> propertyLambda)
不幸的是,这意味着您必须明确指定TResult
:
GetPropertyName<MyObject, bool>(o => o.MyBooleanProperty)
如果您不想这样做,则必须找到推断MyObject
的方法,或者避免需要它。
例如,如果当前对象为MyObject
(并且您使用的是实例方法),则可以将代码更改为Func<TResult>
:
GetPropertyName(() => this.MyBooleanProperty)
或者您可以包含另一个TSource
类型的参数,它可以帮助您推断出类型:
GetPropertyName(myObject, o => o.MyBooleanProperty)