2012-07-09 74 views
0

我有一個類Application,我需要用INotifyPropertyChanged事件重寫。我寫了邏輯覆蓋原來的類,並最終創建SuperApplicationC#強制類重寫類

我從數據庫拉數據雖然,並且不能更改加載邏輯。我只需要一種將原始類中的數據導入到我的超類中的方法。我已經嘗試過像superClass = (SuperApplication)standardClass;之類的東西,但它沒有奏效。

我該如何去做這件事?

如果有幫助,這是我使用重寫原來的類代碼:

public class SuperCreditApplication : CreditApplication 
{ 
    public SuperCreditApplicant Applicant { get; set; } 
    public SuperCreditApplicant CoApplicant { get; set; } 
} 

public class SuperCreditApplicant : CreditApplicant 
{ 
    public SuperProspect Prospect { get; set; } 
} 

public class SuperProspect : Prospect, INotifyPropertyChanged 
{ 
    public State DriverLicenseState 
    { 
     get 
     { 
      return DriverLicenseState; 
     } 
     set 
     { 
      DriverLicenseState = value; 
      OnPropertyChanged("DriverLicenseState"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
+0

你能告訴我們來自'Application'和'SuperApplication'的代碼(或代碼示例)嗎?謝謝。 – 2012-07-09 20:30:39

+0

我剛添加它。 – 2012-07-09 20:31:31

回答

0

這聽起來像你應該使用一個拷貝構造函數,傳遞「從原始類數據」一個參數給新構建的superClass(順便說一句,我認爲名稱Super - 可能是一個錯誤,因爲這會讓人們認爲它是以上的原始在層次結構中)。

通過拷貝構造函數,我的意思是這樣的:

class IWishIWasntCalledSuperApplication : Application 
{ 
    IWishIWasntCalledSuperApplication(Application original) 
    { 
     this.someData = original.someData; 
     this.someOtherData = original.someOtherData; 
     ...etc... 
    } 
} 
0

我認爲你不能只實現INotifyPropertyChanged直接Prospect。如果你不能直接改變Prospect(如要讓所有的屬性virtual),你可以讓你SuperProspect類的包裝爲Prospect

public class SuperProspect : INotifyPropertyChanged 
{ 
    private readonly Prospect _prospect; 

    public SuperProspect(Prospect prospect) 
    { 
     _prospect = prospect; 
    } 

    public State DriverLicenseState 
    { 
     get { return _prospect.DriverLicenseState; } 
     set 
     { 
      _prospect.DriverLicenseState = value; 
      OnPropertyChanged("DriverLicenseState"); 
     } 
    } 

    public void SomeMethod() 
    { 
     _prospect.SomeMethod(); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

然後可以使用SuperProspect這樣

var superProspect = new SuperProspect(myProspect); 

如果創建界面爲您的Prospect成員,那麼您可以讓您的SuperProspectProspect實現相同的界面。如果您然後編程到接口而不是具體的Prospect實現,那麼您的代碼將同時適用於SuperProspect和/或Prospect

0

鑑於您的評論和編輯我需要給一個新的答案洛爾 - 我誤解

你需要使用攔截的事件處理程序添加到其上你無法控制的可能的屬性。就我個人而言,我已經看到使用棱鏡等IoC容器完成了這項工作。我可能在這裏是完全錯誤的,但我認爲MEF可能也有幫助

另一種方法是研究使用T4模板生成代碼以反映現有類以生成超類以及映射到4存在的屬性,代碼來觸發事件。

這看起來 http://lostechies.com/derekgreer/2009/03/01/implementing-inotifyproperychanged-with/

爲了解釋MEF的事情:我敢肯定,我已經看到了INotifyPropertyChanged的迷上了在不同的Silverlight的例子使用MEF。我在閱讀時對這方面不感興趣,所以沒有閱讀。

提取一個接口和使用ioc容器來完成所有繁重的工作將是我想象的最短路線。

0

您沒有說負載是在構建對象還是在稍後的方法調用期間。取決於哪個,它看起來像這兩個代碼示例之一。

//This constructor signature should match your base class's 
public SuperCreditApplication(object a, object b, object c) : base(a,b,c) 
{ 
    //Do whatever you need to do here. The base object's constructor will be called for you 
} 

public Load() 
{ 
    this.BaseObjectLoadMethod(); 
} 

然後,你做一個新的SuperCreditApplication並與此合作。