C# 选择器表达式在.net中是如何工作的?

C# 选择器表达式在.net中是如何工作的?,c#,.net,C#,.net,从Stackoverflow中,我获得了一些有用的代码,可以从我的应用程序中删除魔法字符串。代码如下所示: protected void OnPropertyChanged<T>(Expression<Func<T>> selectorExpression) { } (其中,DisplayName是类的属性。) 使用这种形式的方法真的很有用(我喜欢它是如何容易重构的),但我真的不明白它在做什么 T在哪里赋值,取什么值?intellisense如何识别类具有哪

从Stackoverflow中,我获得了一些有用的代码,可以从我的应用程序中删除魔法字符串。代码如下所示:

protected void OnPropertyChanged<T>(Expression<Func<T>> selectorExpression) { }
(其中,
DisplayName
是类的属性。)

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

T
在哪里赋值,取什么值?intellisense如何识别类具有哪些属性(是从调用方法的上下文隐式设置的
T

()=>DisplayName
表达式是在编译时固定的,还是在每次调用该方法时都进行计算?相关:使用魔法字符串是否更有效?

检查此问题:。这是可能的,因为可以在运行时分析表达式,并且可以从中获取属性名

您还应该阅读以下问题:


归根结底,表达式是一种代码,它不仅可以执行,还可以在运行时作为表达式树进行分析。

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

从MSDN: 表达式树表示树型数据结构中的代码,其中每个节点都是一个表达式,例如,方法调用或二进制操作,如x 然后可以在运行时编译或分析表达式树

Expression<Func<T>> selectorExpression
表达式选择或表达式
表达式的类型,该表达式是一个没有返回类型T的参数的函数

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

Expression<Func<T>> selectorExpression
在OnPropertyChanged方法的情况下,selectorExpression不会被编译和执行,它只是被分析以检索属性名。这篇文章详细介绍了它的工作原理:

尽管我认为OnPropertyChanged处理程序的性能开销可以忽略不计,但这样做会带来性能开销。简单重构的好处远远超过了性能成本