普通代码的表达式树

时间:2010-05-12 07:27:50

标签: c# .net expression-trees introspection

如果你声明它,可以创建一个表达式树。

但是有可能为普通的代码块(例如方法或属性getter)获取表达式树吗?

我想要做的是,假设订单处理系统,我有一个订单项类:

class Item : Entity
{
    [Cascade]
    public Document document { get; set; }
    public int line { get; set; }

    public Product product { get; set; }
    public string description { get; set; }
    public decimal qty { get; set; }
    public decimal price { get; set; }
    public decimal net
    {
        get
        {
            return qty * price;
        }
    }
    public VatCode vat_code { get; set; }
}

其中净值等于qty * price,所以我想声明它,无论是使用属性还是方法,然后还让框架内省该表达式,以便它可以生成适当的SQL来定义相应的计算结果相应数据库视图中的列。

最明显的方法是获取属性getter或方法的表达式树,但我找不到任何指示如何执行此操作,或者它是可能的。 (我已经找到了一种将方法体作为字节流的方法,但这不是这里所希望的。)

如果那是不可能的,我认为建议的解决方案是声明类似于表达式树的静态字段,并在运行时编译/运行它以供内部使用,并且也像SQL生成一样内省?

2 个答案:

答案 0 :(得分:1)

不,不可能 - 普通代码是字节码,没有机制将其转换为表达式树。你可以做的就是使用反射 - 但基本上就是它。

答案 1 :(得分:1)

我之前一直在寻找类似的东西,而且我还没有找到一个完美的方法来做到这一点,tbh。

你可能遇到的另一个问题是,即使你有一个你想要在linq查询中注入的表达式树 - 它不是直截了当的,而且听起来很简单......

对于它的价值,一种方法是存储一个静态表达式,允许你的“网”出来,并让“net”属性的getter对this运行这个表达式。 / p>

如何在常规linq查询中注入表达式? 我写了一篇关于它的blog post。基本上,我创建了一个表达式扩展器,它将使用自定义表达式更新L2S表达式树:) Extending LINQ selectors with custom expressions