这很可能是重复的,但我找不到合适的问题。
我想从 () => MyClass.Name
获取 "MyClass.Name"
。如何定义方法参数以及如何将表达式转换为字符串?
最佳答案
那是一个 Expression<Func<string>>
,所以你可以:
void Foo(Expression<Func<string>> selector) {...}
或
void Foo<T>(Expression<Func<T>> selector) {...}
但是,请注意语法 MyClass.Name
引用一个static 属性;如果你想要一个 instance 属性,你可能需要更像 Expression<Func<MyClass,string>>
的东西- 例如:
static void Foo<TSource, TValue>(
Expression<Func<TSource, TValue>> selector)
{
}
static void Main() {
Foo((MyClass obj) => obj.Name);
}
至于实现; 在这个简单的例子中,我们可以预期 Body
成为MemberExpression
,所以:
static void Foo<TSource, TValue>(
Expression<Func<TSource, TValue>> selector)
{
var member = ((MemberExpression)selector.Body).Member;
Console.WriteLine(member.ReflectedType.Name + "." + member.Name);
}
然而,在一般情况下它更复杂。如果我们使用静态成员,这也将起作用:
static void Foo<TValue>(
Expression<Func<TValue>> selector)
{
var member = ((MemberExpression)selector.Body).Member;
Console.WriteLine(member.ReflectedType.Name + "." + member.Name);
}
关于.net - 从表达式中获取类名和属性名 () => MyClass.Name,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5040327/