Nik*_*wal 34 c# linq exception-handling expression-trees
public string GetCorrectPropertyName<T>(Expression<Func<T, string>> expression)
{
return ((MemberExpression)expression.Body).Member.Name; // Failure Point
}
Run Code Online (Sandbox Code Playgroud)
并称之为
string lcl_name = false;
public string Name
{
get { return lcl_name ; }
set
{
lcl_name = value;
OnPropertyChanged(GetCorrectPropertyName<ThisClassName>(x => x.Name));
}
}
Run Code Online (Sandbox Code Playgroud)
如果property是string,并且所有其他类型都提供此异常,则此方法正常:
无法将类型为"System.Linq.Expressions.UnaryExpression"的对象强制转换为"System.Linq.Expressions.MemberExpression".
x => x.PropertyName到x => Convert.ToString(x.PropertyName),它仍然失败我哪里错了?
Jon*_*ton 55
您需要一个单独的行来提取输入表达式为一元表达式的Member.
刚刚从VB.Net转换了这个,所以可能稍微关闭 - 让我知道我是否需要进行任何小调整:
public string GetCorrectPropertyName<T>(Expression<Func<T, Object>> expression)
{
if (expression.Body is MemberExpression) {
return ((MemberExpression)expression.Body).Member.Name;
}
else {
var op = ((UnaryExpression)expression.Body).Operand;
return ((MemberExpression)op).Member.Name;
}
}
Run Code Online (Sandbox Code Playgroud)
VB版本是:
Public Shared Function GetCorrectPropertyName(Of T) _
(ByVal expression As Expression(Of Func(Of T, Object))) As String
If TypeOf expression.Body Is MemberExpression Then
Return DirectCast(expression.Body, MemberExpression).Member.Name
Else
Dim op = (CType(expression.Body, UnaryExpression).Operand)
Return DirectCast(op, MemberExpression).Member.Name
End If
End Function
Run Code Online (Sandbox Code Playgroud)
请注意,输入表达式不会返回字符串 - 这会限制您只读取返回字符串的属性.