如何从 expression-bodied 属性 c# 中获取表达式

How to get expression from expression-bodied property c#

我想得到 Expression-bodied 的 Expression 属性。我不知道该怎么做;/这是简单的代码片段:

class TestTest
{
    public int A { get; set; } = 5;

    public int AX5 => A * 5;
}
public class Program
{

    public static void Main()
    {
        var testObj = new TestTest();

        Expression<Func<TestTest, int>> expr = (t) => t.AX5;
    }

}

此代码有效,但 AX5 未标记为表达式,它是简单的 Int32 属性。

这是我想从 属性 得到的结果:

所谓的“Expression-Body”只是用来缩短函数和属性 声明的糖分。它与 Expression<> 类型有任何关系。

你的class中的'expression-bodied'属性相当于:

public int AX5 
{
    get { return A * 5; }
}

但是,如果你真的想捕获这个只读的属性,你必须通过反射检索编译器生成的get-method,然后在Func<int>中添加一个额外的参数为了传递 object-instance 属性 属于 -> Func<TestTest, int>.

这是一个例子:

class TestTest
{
    public int A { get; set; } = 5;

    public int AX5 => A * 5;
}

var f = typeof(TestTest).GetMethod("get_AX5")
                        .CreateDelegate(typeof(Func<TestTest, int>))
                        as Func<TestTest, int>;

Expression<Func<TestTest, int>> exp = instance => f(instance);

请注意,这是添加一个额外的函数调用来捕获新的 lambda-expression。否则将 get-method 转换为表达式会变得相当复杂。

虽然这不是很有用,但通常您希望以相反的方式工作并构建表达式树以便稍后将它们编译为委托。

查看 Expression Trees 的文档以获取更多信息。