我有这样的代码
private decimal m_Amount;
public decimal Amount
{
get
{
return m_Amount;
}
set
{
m_Amount = value;
NotifyPropertyChanged("Amount");
}
}
但我想在没有声明m_Amount
变量的情况下执行此操作,并在.Net 4中也通知。
在这种情况下,如何避免备份字段。
请建议我。
答案 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。 但是,我不建议使用拦截器,因为它会导致设计不太好。除非有人要求,否则我不会详细说明; - )