C# 属性Lambda表达式获取额外的转换(p=>;p.Property)

C# 属性Lambda表达式获取额外的转换(p=>;p.Property),c#,lambda,C#,Lambda,我有一个问题,在某些情况下(似乎属性类型是bool),lambda表达式用于引用属性。我用这个来得到它的名字;问题是表达式有时会被修改为具有额外的Convert()函数 e、 g GetPropertyName(表达式propertyLambda){…} var str=GetPropertyName(o=>o.MyBooleanProperty); 发生了什么?propertyLambda看起来像Convert(o.MyBooleanProperty),而不是我期望的o.MyBooleanP

我有一个问题,在某些情况下(似乎属性类型是bool),lambda表达式用于引用属性。我用这个来得到它的名字;问题是表达式有时会被修改为具有额外的Convert()函数

e、 g

GetPropertyName(表达式propertyLambda){…}
var str=GetPropertyName(o=>o.MyBooleanProperty);

发生了什么?propertyLambda看起来像
Convert(o.MyBooleanProperty)
,而不是我期望的
o.MyBooleanProperty

添加了
Convert
,因为
o.MyBooleanProperty
是一个
bool
,但结果必须是一个对象。如果在源对象类型和结果类型中使方法都是泛型的,那么就不会有
Convert

GetPropertyName<TSource, TResult>(Expression<Func<TSource, TResult>> propertyLambda)
如果您不想这样做,您必须找到某种方法来推断
MyObject
,或者避免需要它

例如,如果当前对象是
MyObject
(并且您在实例方法中),则可以将代码更改为take
Func

或者,您可以包含另一个类型为
TSource
的参数,该参数将帮助您推断类型:

GetPropertyName(myObject, o => o.MyBooleanProperty)

对不起,问题到底是什么?
Convert
函数从何而来?我们可以看看GetPropertyName实现代码吗?请看“”。好的,谢谢john。但问题的一部分是有什么想法[为什么会发生这种情况]?-正如Philip提到的,它看起来更像是一个在结尾没有问题的陈述。但是感谢您的努力。非常感谢@svick-给出您的最后一个示例
GetPropertyName(myObject,o=>o.MyBooleanProperty)
-函数声明是什么样子的,我显然需要添加一个对象参数?另外,是否可以创建一个扩展来提供基于此
GetPropertyName(()=>this.MyBooleanProperty)的GetPropertyName扩展方法
示例?最后一个选项的声明类似于
GetPropertyName(TSource obj,Expression propertyLambda)
。我不知道你说的扩展方法是什么意思,在这个选项中,你不需要任何实例,它可以是普通的静态方法。
GetPropertyName<MyObject, bool>(o => o.MyBooleanProperty)
GetPropertyName(() => this.MyBooleanProperty)
GetPropertyName(myObject, o => o.MyBooleanProperty)