1

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

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

该方法由以下方式调用:

this.OnPropertyChanged( () => DisplayName);

DisplayName(类的属性在哪里。)

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

在哪里T赋值,取什么值?智能感知如何获取类具有哪些属性(T从调用方法的上下文中隐式设置?)

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

4

2 回答 2

1

检查这个问题:从 lambda 表达式中检索属性名称。这要归功于可以在运行时分析的表达式,并且可以从中获取属性名称。

您还应该阅读这个问题:Expression<Func<>> 和 Func<> 之间的区别

最重要的是,表达式是不仅可以执行而且可以在运行时作为表达式树进行分析的代码。

于 2012-04-30T09:59:05.290 回答
1

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

来自 MSDN:表达式树表示树状数据结构中的代码,其中每个节点都是一个表达式,例如,方法调用或二元运算,例如 x < y。 http://msdn.microsoft.com/en-us/library/bb397951.aspx

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

Expression<Func<T>> selectorExpression

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

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

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

尽管我认为 OnPropertyChanged 处理程序可以忽略不计,但这样做会产生性能开销。轻松重构的好处大大超过了性能成本。

于 2012-04-30T10:11:25.210 回答