C# 如何从表达式中获取字段的名称?

C# 如何从表达式中获取字段的名称?,c#,C#,我有一个表达式,传递给一个函数,它看起来像这样: x=>x.SomeField 我想以某种方式获得这个字段的名称,即“SomeField”,以便作为字符串对我进行访问。 我意识到可以调用myExpression.ToString(),然后解析字符串,但我需要更可靠、更快的方法。您必须实现表达式树访问者 如果将评估代码放入MemberAccessExpression访问中,则必须实现表达式树访问 您将评估代码放在MemberAccessExpression访问中我使用了框架中可用的一些

我有一个表达式,传递给一个函数,它看起来像这样:

x=>x.SomeField
我想以某种方式获得这个字段的名称,即“SomeField”,以便作为字符串对我进行访问。
我意识到可以调用myExpression.ToString(),然后解析字符串,但我需要更可靠、更快的方法。

您必须实现表达式树访问者


如果将评估代码放入MemberAccessExpression访问中,则必须实现表达式树访问


您将评估代码放在MemberAccessExpression访问中

我使用了框架中可用的一些帮助程序来完成此任务。具体来说,您可能会对

中的类感兴趣。我使用了框架中的一些可用帮助程序来实现这一点。具体来说,您可能会对公共字符串GetMemberName(Expression expr)中的类感兴趣 { var memberExpr=expr.Body作为MemberExpression; if(memberExpr==null) 抛出新ArgumentException(“表达式体必须是MemberExpression”); 返回memberExpr.Member.Name; } ... MyClass x=/*无论什么*/; string name=GetMemberName(()=>x.Something);//返回“某物”
公共字符串GetMemberName(表达式expr)
{
var memberExpr=expr.Body作为MemberExpression;
if(memberExpr==null)
抛出新ArgumentException(“表达式体必须是MemberExpression”);
返回memberExpr.Member.Name;
}
...
MyClass x=/*无论什么*/;
string name=GetMemberName(()=>x.Something);//返回“某物”

更短-如果他只需要处理MemberExpressions。如果你想静态定义propertyName:static readonly string SomethingProperty=GetMemberName(()=>default(MyClass).Something;此外,如果他只需要处理MemberExpressions,您可能需要禁用警告1720,以便不检查空使用。如果您想静态定义propertyName:static readonly string SomethingProperty=GetMemberName(()=>default(MyClass).Something;此外,您可能希望禁用警告1720,以便不选中空使用Yes-这是真的。但大部分事情都是从一个简单的任务开始的:-)谢谢你的链接。当有更大的事情发生时,我会牢记在心。是的,这是真的。但大部分事情都是从一个简单的任务开始的:-)谢谢你的链接。当有更大的事情发生时,我会牢记在心
public string GetMemberName<T>(Expression<Func<T>> expr)
{
    var memberExpr = expr.Body as MemberExpression;
    if (memberExpr == null)
        throw new ArgumentException("Expression body must be a MemberExpression");
    return memberExpr.Member.Name;
}

...

MyClass x = /* whatever */;
string name = GetMemberName(() => x.Something); // returns "Something"