从表达式中获取类名和属性名 () => MyClass.Name

jga*_*fin 3 .net linq expression

这很可能是重复的,但我找不到合适的问题。

我想"MyClass.Name"() => MyClass.Name. 如何定义方法参数以及如何将表达式转换为字符串?

Mar*_*ell 5

那是一个Expression<Func<string>>,所以你可以有:

void Foo(Expression<Func<string>> selector) {...}
Run Code Online (Sandbox Code Playgroud)

或者

void Foo<T>(Expression<Func<T>> selector) {...}
Run Code Online (Sandbox Code Playgroud)

但是,请注意语法MyClass.Name是指静态属性;如果你想要一个实例属性,你可能需要更像一个的东西Expression<Func<MyClass,string>>- 例如:

static void Foo<TSource, TValue>(
    Expression<Func<TSource, TValue>> selector)
{

}
static void Main() {
     Foo((MyClass obj) => obj.Name);        
}
Run Code Online (Sandbox Code Playgroud)

至于执行;在这个简单的情况下,我们可以期望Bodya MemberExpression,所以:

static void Foo<TSource, TValue>(
    Expression<Func<TSource, TValue>> selector)
{
    var member = ((MemberExpression)selector.Body).Member;
    Console.WriteLine(member.ReflectedType.Name + "." + member.Name);
}
Run Code Online (Sandbox Code Playgroud)

然而,在一般情况下它更复杂。如果我们使用静态成员,这也将起作用:

static void Foo<TValue>(
    Expression<Func<TValue>> selector)
{
    var member = ((MemberExpression)selector.Body).Member;
    Console.WriteLine(member.ReflectedType.Name + "." + member.Name);
}
Run Code Online (Sandbox Code Playgroud)