问题描述
我想获取表达式主体属性的表达式。我不知道该怎么做; /这是简单的代码片段:
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未标记为Expression,它是简单的Int32属性。
解决方法
所谓的“ 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的文档以获取更多信息。