从Stackoverflow,我已经选择了一些有用的代码来从我的应用程序中删除魔术字符串。代码如下所示:
protected void OnPropertyChanged<T>(Expression<Func<T>> selectorExpression) { }
该方法由:
调用this.OnPropertyChanged( () => DisplayName);
(其中DisplayName
是该类的属性。)
使用这种形式的方法非常有用(我喜欢它很容易重构)但我真的不明白它在做什么。
T
在哪里分配,需要什么价值? intellisense如何获取该类具有的属性(从调用该方法的上下文中隐式设置T
?)
() => DisplayName
表达式是否在编译时固定,或者每次调用方法时是否计算?相关:使用魔术字符串更有效吗?
答案 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处理程序可以忽略不计。轻松重构的好处大大超过了性能成本。