选择器表达式如何在.net中工作?

时间:2012-04-30 09:56:32

标签: c# .net

从Stackoverflow,我已经选择了一些有用的代码来从我的应用程序中删除魔术字符串。代码如下所示:

protected void OnPropertyChanged<T>(Expression<Func<T>> selectorExpression) { }

该方法由:

调用
this.OnPropertyChanged( () => DisplayName);

(其中DisplayName是该类的属性。)

使用这种形式的方法非常有用(我喜欢它很容易重构)但我真的不明白它在做什么。

T在哪里分配,需要什么价值? intellisense如何获取该类具有的属性(从调用该方法的上下文中隐式设置T?)

() => DisplayName表达式是否在编译时固定,或者每次调用方法时是否计算?相关:使用魔术字符串更有效吗?

2 个答案:

答案 0 :(得分:1)

检查此问题:Retrieving Property name from lambda expression。这可以归功于可以在运行时分析的表达式,并且可以从中获取属性名称。

您还应该阅读这个问题:Difference between Expression<Func<>> and Func<>

底线是Expression是不仅可以执行的代码,还可以在运行时作为表达式树进行分析。

答案 1 :(得分:1)

Expression类通常用于编写可在运行时更改的动态代码。 T是lambda返回的类型。它可以是任何类型。

来自MSDN: 表达式树表示树状数据结构中的代码,其中每个节点是表达式,例如,方法调用或二进制操作,例如x&lt;年。 http://msdn.microsoft.com/en-us/library/bb397951.aspx

然后可以在运行时编译或分析表达式树。

Expression<Func<T>> selectorExpression

是表达式的类型,该表达式是没有返回类型T的参数的函数。

您可以在运行时编译并运行selectorExpression。

对于OnPropertyChanged方法,selectExpression未编译和执行,只是分析它以检索属性名称。这篇文章详细介绍了它的工作原理:Retrieving Property name from lambda expression

执行此操作会产生性能开销,但在我看来,OnPropertyChanged处理程序可以忽略不计。轻松重构的好处大大超过了性能成本。