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

标签 .net linq expression

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

我想从 () => 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/

相关文章:

c# - LINQ 中的 .Take 方法是否有通配符?

c# - "variable ' ' of type ' System.Boolean ' referenced from scope ' ', but it is not defined"在表达式中

lambda - 避免由于冗余转换而导致 lambda 表达式中出现代码分析 CA1800 错误

c# - Silverlight:TextBlock 没有模板属性?

c# - 如何在 C# 中对模板使用 new 运算符

.net - Powershell HTTPS REST api GET/POST

.net - LINQ左表的右外部联接/右表上的日期范围限制?

.net - 如何正确构建 netstandard1.0 NuGet 包的依赖关系?

c# - 默认后不能出现linq过滤器?

r - 在警告中引用名称