gpt4 book ai didi

c# - 无法将类型为 'System.Linq.Expressions.UnaryExpression' 的对象转换为类型 'System.Linq.Expressions.MemberExpression'

转载 作者:IT王子 更新时间:2023-10-29 04:04:40 24 4
gpt4 key购买 nike

我创建了一个 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));
}
}

如果属性是字符串并且对于所有其他类型给出此异常,这工作正常:

Unable to cast object of type 'System.Linq.Expressions.UnaryExpression' to type 'System.Linq.Expressions.MemberExpression'.

  1. 我在方法签名中将字符串更改为对象,但随后又失败了。
  2. 我将调用从 x => x.PropertyName 更改为 x => Convert.ToString(x.PropertyName) 但它仍然失败

我哪里错了?

最佳答案

您需要单独一行来提取输入表达式为一元表达式的成员。

刚刚从 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;
}
}

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

请注意,输入表达式不一定返回字符串 - 这会限制您只能读取返回字符串的属性。

关于c# - 无法将类型为 'System.Linq.Expressions.UnaryExpression' 的对象转换为类型 'System.Linq.Expressions.MemberExpression',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12420466/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com