如何从表达式健全的属性C#中获取表达式

问题描述

我想获取表达式主体属性的表达式。我不知道该怎么做; /这是简单的代码片段:

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;
    }

}

enter image description here

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

这是我想从物业获得的结果:

enter image description here

解决方法

所谓的“ Expression-Body”只是用来缩短函数和属性声明的糖。 与Expression 类型无关。

您课程中的'expression-bodied'属性等同于:

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

但是,如果您真的想捕获此readonly属性,则必须通过反射检索编译器生成的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表达式。否则,将get方法转换为表达式将变得相当复杂。

这不是很有用,通常您想以其他方式工作并构建表达式树,以便稍后将它们编译为委托。

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...