我已经看到了许多INotifyPropertyChanged(自动INotifyPropertyChanged)的实现,除了MemberExpression之外,还支持UnaryExpression。UnaryExpression的示例包括在表达式中使用一元操作符,例如,
RiasePropertyChanged(() => !MyPropertyName);
是否有足够的理由保证将其包含在属性名称提取中?我假定对UnaryExpression的支持是因为您可以从中提取MemberExpression。
这个实现与Prism NotificationObject不同,社区对此有任何赞成或反对意见吗?
我只在有人希望支持多种方式来引用成员的情况下看到过这种情况。将其限制为UnaryExpression稍微限制了您。
没关系…添加对两者的支持主要是出于性能考虑,但最终可能不会产生太大的影响。我建议两者都要支持,这样你就不会冒着让用法变得更加抽象的风险。
下面是我们的用法:
public void OnPropertyChanged<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;
}
OnPropertyChanged(memberExpression.Member.Name);
}