我创建了一个method in C#来获取方法名
public string GetCorrectPropertyName<T>(Expression<Func<T, string>> expression)
{
return ((MemberExpression)expression.Body).Member.Name; // Failure Point
}
并称之为
string lcl_name = false;
public string Name
{
get { return lcl_name ; }
set
{
lcl_name = value;
OnPropertyChanged(GetCorrectPropertyName<ThisClassName>(x => x.Name));
}
}
如果property是字符串,则此方法可以正常工作,而对于所有其他类型,则会出现以下异常:
无法将类型为“System.Linq.Expression.UnaryExpression”的对象强制转换为类型“System.Linq.Expression.MemberExpression”。
1.我在方法签名中将string更改为object,但它再次失败。
1.我将呼叫从x => x.PropertyName
更改为x => Convert.ToString(x.PropertyName)
,但仍然失败
我哪里错了?
5条答案
按热度按时间mdfafbf11#
如果输入表达式是一元表达式,则需要单独的一行来提取成员。
刚从VB .NET转换过来,所以可能会有一些小问题--如果需要做一些小的调整,请告诉我:
VB版本为:
请注意,输入表达式不一定返回字符串-这限制了您只能阅读返回字符串的属性。
li9yvcax2#
这是与装箱/取消装箱相关的apparently。返回需要装箱的值类型的Lambda表达式将表示为UnaryExpressions,而返回引用类型的Lambda表达式将表示为MemberExpressions。
hm2xizp93#
问完这个问题(是的,我是OP)后,我收到了Jon对问题的评论
我想出了这个
4c8rllxm4#
以上答案的现代版本。
iqih9akk5#
如果您必须处理条件表达式,请添加以下内容: