.Net 4中的NotifyPropertyChanged

时间:2014-03-05 12:43:47

标签: .net c#-4.0

我有这样的代码

private decimal m_Amount;
public decimal Amount
{
    get
    {
         return m_Amount;
    }
    set
    {
         m_Amount = value;
         NotifyPropertyChanged("Amount");
    }
}

但我想在没有声明m_Amount变量的情况下执行此操作,并在.Net 4中也通知。

在这种情况下,如何避免备份字段。

请建议我。

3 个答案:

答案 0 :(得分:4)

好吧,如果您使用C#5编译器(VS2012 / VS2013)和Microsoft.Bcl NuGet包,则可以将CallerMemberNameAttribute与.NET 4一起使用。您仍需要单独声明该字段但是,因为你不能只使用自动实现的属性。 (你所做的不仅仅是简单的读/写。)

或者,你可以使用像PostSharp这样的AOP包 - 我不会开始使用PostSharp 只是来摆脱这样的属性,但如果你有其他的你想要以声明方式处理的跨领域问题,这将是有用的。

如果您不想使用BCL NuGet包,可以自己声明CallerMemberNameAttribute - 只需将声明复制并粘贴到您自己的代码中,但要确保放置它进入正确的命名空间(System.Runtime.CompilerServices)。请注意,以后更新到.NET 4.5时会出现问题。

答案 1 :(得分:0)

link应该可以帮到你。你这样使用它

RaisePropertyChanged(() => Amount);

答案 2 :(得分:0)

您可以使用AOP(Aspect Oriented Programming)来实现此目的。 您可以通过IL编织或拦截器进行AOP。对于这个特殊的问题,我会用IL编织。

这两种IL编织很受欢迎:

<强> Fody

Fody是免费的&amp;开源并作为nuget包提供。 有PropertyChanged Extension将为您实现属性更改通知方面。它也可以作为nuget包使用。

我们已经使用了fody很长一段时间了,并且非常满意。您的代码可以像这样简单:

[ImplementPropertyChanged]
public class SomeViewModel
{
    Decimal Amount{ get; set; }
}

<强> PostSharp

PostSharp是商业广告。 This解释了如何编织财产变更通知。


<强>拦截

您还可以使用interceptor实现属性更改通知方面。流行的拦截器框架之一是Castle.DynamicProxy,另一个是LinFu Dynamic proxy。 但是,我不建议使用拦截器,因为它会导致设计不太好。除非有人要求,否则我不会详细说明; - )