使用linq表达式的typesafe NotifyPropertyChanged

bit*_*onk 7 wpf mvvm expression-trees inotifypropertychanged

表单构建自己的MVVM我有以下代码,让我们有类型安全的NotifyOfPropertyChange调用:

public void NotifyOfPropertyChange<TProperty>(Expression<Func<TProperty>> property)
{
    var lambda = (LambdaExpression)property;
    MemberExpression memberExpression;
    if (lambda.Body is UnaryExpression)
    {
        var unaryExpression = (UnaryExpression)lambda.Body;
        memberExpression = (MemberExpression)unaryExpression.Operand;
    }
    else memberExpression = (MemberExpression)lambda.Body;
    NotifyOfPropertyChange(memberExpression.Member.Name);
 }
Run Code Online (Sandbox Code Playgroud)

这种方法与标准的简单字符串方法相比如何?有时我的属性会以非常高的频率发生变化.我可以安全地使用这种类型安全的方法吗?经过一些初步测试后,似乎确实产生了一些小的差异.这种方法可能导致内存负载多少CPU?

Mar*_*ell 5

引发这种情况的代码是什么样的?我它是这样的:

NotifyOfPropertyChange(() => SomeVal);
Run Code Online (Sandbox Code Playgroud)

这隐含着:

NotifyOfPropertyChange(() => this.SomeVal);
Run Code Online (Sandbox Code Playgroud)

它捕获了this,并且非常多意味着每次都必须Expression.Constant从头开始构造表达式树.然后你每次解析它.所以开销肯定是非平凡的.

实在是太多了,虽然?这是一个只有你可以回答的问题,通过你的应用程序的分析和知识.它被看作是确定了很多MVC使用的,但不是(一般)称它在长时间运行紧密的循环.基本上,您需要针对所需的性能目标进行分析.