Linq表达式帮助-INotifyPropertyChanged

Linq表达式帮助-INotifyPropertyChanged,linq,data-binding,mvvm,Linq,Data Binding,Mvvm,我正在阅读最新的Prism 4 drop的源代码,并对解决这个问题感兴趣。ViewModels有一个基类,它实现INotifyPropertyChanged和INotifyDataErrorInfo,并提供一些重构友好的更改通知 protected void RaisePropertyChanged<T>(Expression<Func<T>> propertyExpresssion) { var propertyName = ExtractPrope

我正在阅读最新的Prism 4 drop的源代码,并对解决这个问题感兴趣。ViewModels有一个基类,它实现INotifyPropertyChanged和INotifyDataErrorInfo,并提供一些重构友好的更改通知

protected void RaisePropertyChanged<T>(Expression<Func<T>> propertyExpresssion)
{
    var propertyName = ExtractPropertyName(propertyExpresssion);
    this.RaisePropertyChanged(propertyName);
}



private string ExtractPropertyName<T>(Expression<Func<T>> propertyExpresssion)
{
    if (propertyExpresssion == null)
    {
        throw new ArgumentNullException("propertyExpression");
    }

    var memberExpression = propertyExpresssion.Body as MemberExpression;
    if (memberExpression == null)
    {
        throw new ArgumentException("The expression is not a member access expression.", "propertyExpression");
    }

    var property = memberExpression.Member as PropertyInfo;
    if (property == null)
    {
        throw new ArgumentException("The member access expression does not access  property.","propertyExpression");
    }

    if (!property.DeclaringType.IsAssignableFrom(this.GetType()))
    {
       throw new ArgumentException("The referenced property belongs to a different type.", "propertyExpression");
    }

    var getMethod = property.GetGetMethod(true);
    if (getMethod == null)
    {
        // this shouldn't happen - the expression would reject the property before reaching this far
        throw new ArgumentException("The referenced property does not have a get method.", "propertyExpression");
    }

    if (getMethod.IsStatic)
    {
        throw new ArgumentException("The referenced property is a static property.", "propertyExpression");
    }

    return memberExpression.Member.Name;
    }
我的问题是。将属性名数组传递给重载方法(RaisePropertyChanged)并将最后一位代码从4行压缩为1,需要做什么

谢谢,,
斯蒂芬:你考虑过改变一下吗

protected void RaisePropertyChanged<T>(Expression<Func<T>> propertyExpresssion)
{
    var propertyName = ExtractPropertyName(propertyExpresssion);
    this.RaisePropertyChanged(propertyName);
}
也许有人认为这是一个糟糕的做法,但至少要做到这一点。
祝你好运。

你是否考虑过改变:

protected void RaisePropertyChanged<T>(Expression<Func<T>> propertyExpresssion)
{
    var propertyName = ExtractPropertyName(propertyExpresssion);
    this.RaisePropertyChanged(propertyName);
}
也许有人认为这是一个糟糕的做法,但至少要做到这一点。
祝你好运。

我无法编译此文件。受保护的void RaisePropertyChanged(params Expression[]propertyExpression){foreach(propertyExpression.Select中的var propertyName(ExtractPropertyName)){this.RaisePropertyChanged(propertyName);}}方法'System.Linq.Enumerable.Select'的类型参数(System.Collections.Generic.IEnumerable,System.Func)'无法从用法中推断。请尝试显式指定类型参数。在我的试错测试期间,这对我有效的唯一方法是,如果您足够幸运,能够为传递给RaisePropertyChanged方法的所有属性提供相同的数据类型。在上面的示例中,您传递了一个字符串和2ts和我非常怀疑这是否有效,或者我应该说我仍然无法让它一字不差地工作。为了确保每个人都在同一页上,可能从其他评论中推断出一些东西,我需要编写代码,但我没有找到。我只是在尝试摸索这些东西,这远远超出了我的心智能力。我无法让这些东西消失compile.protected void RaisePropertyChanged(参数表达式[]PropertyExpression){foreach(PropertyExpression.Select(ExtractPropertyName)){this.RaisePropertyChanged(propertyName);}}}方法'System.Linq.Enumerable.Select(System.Collections.Generic.IEnumerable,System.Func)的类型参数'无法从用法中推断。请尝试显式指定类型参数。在我的试错测试期间,这对我有效的唯一方法是,如果您足够幸运,能够为传递给RaisePropertyChanged方法的所有属性提供相同的数据类型。在上面的示例中,您传递了一个字符串和2ts和我非常怀疑这是否有效,或者我应该说我仍然无法让它一字不差地工作。为了确保每个人都在同一页上,可能从其他评论中推断出一些东西,我需要编写代码,但我遗漏了。我只是在尝试摸索这些东西,这远远超出了我的心智能力。作为旁注,就个人而言,我不同意在setter之外的属性上提升已更改的属性。我认为上面的代码实际上应该只设置有问题的属性。作为旁注,就个人而言,我不同意在setter之外的属性上提升已更改的属性。我认为上面的代码实际上应该只设置属性这是个问题。
protected void RaisePropertyChanged<T>(params Expression<Func<T>>[] propertyExpresssion)
{
    foreach (var propertyName in 
         propertyExpresssion.Select(ExtractPropertyName))
    {
        this.RaisePropertyChanged(propertyName);
    }
}
private void RetrieveNewQuestionnaire()
{
      //yada yada yada
      this.RaisePropertyChanged(() => this.Name, 
                                () => this.UnansweredQuestions, 
                                () => this.TotalQuestions);
}