2009-11-02 17 views
6

Bu, yalnızca Öznitelikler üzerinde öğrendiğim ve INotifyPropertyChanged'i çok fazla kullanıyorum diye düşündüğüm bir şey, sadece ve Fikir ve bu konuda bazı görüşler duymak istiyorum. Bu, derleyici üzerinde bazı çalışmalar gerektirir ve kosuler tarafında değil)Özniteliklerin Kullanılması ... INotifyPropertyChanged

INotifyPropertyChanged çoğu zaman aynı Modelle birlikte kullanıldığından beri. Öznitelik ve Otomatik Özellikler'i kullanarak tasarlanabilir mi? Derleyici, CallChanged olayına çağrı eklemenin gerekli olduğunu biliyor mu? biz sınıf ....

public class DemoCustomer : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 

    private string companyNameValue = String.Empty; 
     ... 
} 

yerine beyan mülkiyet sahip Yani eğer

public string CompanyName 
    { 
     get 
     { 
      return this.companyNameValue; 
     } 

     set 
     { 
         if (value != this.companyNameValue) 
         { 
          this.companyNameValue = value; 
          NotifyPropertyChanged("CompanyName"); 
         } 
     } 
    } 

biz gerektiğini bu özniteliği tarafından derleyiciye gösterebilir eğer böyle bir şey yapabileceğini yeni değer hala t kodlama tutmak önceki

[NotifyPropertyChanged] 
public string CompanyName 
{ 
    get;set; 
} 

den farklı ise mülkiyetin adı ile PropertyChanged çağrısı oluşturmak Öznitelik kullanıldığında bazı özel davranışlar için eski yol ..

cevap

8

yapabilirsiniz do this tarihinde Jason Bock 'ın Dimecast bakabilirsiniz ama yakın zamanda bu çekirdek derleyici olacak sanmıyorum.

4

Bu tarz düşünme, Aspect Yönelimli Programlama (veya AOP) olarak adlandırılır. Bu sonuca sahip mülkleri incelemek ve mülkün davranışını değiştirmek ve yeni derlenmiş montajı uygun davranışla tükürmek için Mono'nun Cecil'i kullanarak bir yayın oluşturma eylemi ekleyerek son sonucu elde edebilirsiniz. Sen PostSharp ile 'Leveraging Cecil to inject code into your Assemblies'

+0

Çok iyi okuma .. Çok teşekkürler ... postsharp kullanmaya başladım ... bu yüzden diğer cevabı işaret ediyorum. Ama bu da yararlıdır. – jmayor

7

Bu iş parçacığı üzerinde herhangi birinin olması durumunda ve C# 5 (VS 2012+, .NET 4.5+) kullanıyorsa. Bu dava şimdi CallerMemberNameAttribute ile "daha kolay" yapılabilir. Bu öznitelik, bir dize parametresine uygulanır ve kullandığımız varsayılan değer (yani ne zaman argüman geçmezse) derleyicinin çağıran yöntem/özellik adına iletmesine neden olur. Uygulamanın INotifyPropertyChanged daha az yorulmadan yapılması. Örneğin:

public class MyClass 
{ 
    private string myProperty; 

    public string MyProperty 
    { 
     get { return myProperty; } 
     set 
     { 
      myProperty = value; 
      OnPropertyChanged(); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

Yani, sadece olayı göndermek için her setter OnPropertyChanged() ihtiyaç ve mülkiyet adı için bir sabit kodlanmış dize ile uğraşmak zorunda değilsiniz.

İlgili konular