2012-07-09 6 views
0

나는 INotifyPropertyChanged 이벤트로 대체해야하는 클래스 Application이 있습니다. 원래 클래스를 재정의하는 논리를 작성하여 생성을 완료했습니다. SuperApplication오버라이드 클래스에 C# 캐스트 클래스

라이브러리에서 데이터를 가져 오는 중이며 로딩 논리를 변경할 수 없습니다. 난 원래 클래스에서 슈퍼 클래스로 데이터를 가져 오는 방법이 필요합니다. 나는 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'의 코드 (또는 코드 샘플)를 표시 할 수 있습니까? 감사. –

+0

방금 ​​추가했습니다. –

답변

0

그것은 "원래 클래스에서 데이터를"전달, 소리 :

도움이된다면

이 내가 원래 클래스를 재정의 사용하고 코드입니다 새로 생성 된 superClass에 대한 매개 변수 (덧붙여서, Super이라는 이름은 아마 실수 일 것입니다. 사람들이 위의 계층 구조의 원래이라고 생각하게 만듭니다.) 나는 그냥 Prospect에 직접 INotifyPropertyChanged을 구현할 수 있다고 가정

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

:

는 복사 생성자, 나는 같은 것을 의미한다. 직접 (같은 모든 속성 virtual을) Prospect를 변경할 수 없다면, 당신은 당신이를 만들 경우 그런 다음이

var superProspect = new SuperProspect(myProspect); 

같은 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 클래스 래퍼를 만들 수 있습니다 인터페이스를 구현 한 경우 SuperProspectProspect 모두 동일한 인터페이스를 구현할 수 있습니다. 콘크리트 Prospect 구현이 아닌 인터페이스로 프로그래밍하면 SuperProspect 및/또는 Prospect 코드가 작동합니다. 난 당신이 당신이 아마 통제 할 수없는 통해 속성에 이벤트 핸들러를 추가 차단을 사용할 필요가

을 오해 - 당신의 코멘트 및 편집을 감안할 때

0

나는 롤 새로운 대답을해야합니다. 개인적으로 프리즘과 같은 IoC 컨테이너를 사용하여 이것을 보았습니다. 나는 BTW 여기 completley 잘못 될 수있다하지만 난 MEF는 또한 슈퍼 클래스를 생성하기 위해 기존 클래스를 통해 반영하기 위해 T4 템플릿을 사용하여 코드 생성을 조사하는 것입니다

또 다른 방법은 도움이 될 수 있습니다 생각하고 4existing에 매핑 속성은 포함됩니다 이벤트를 발생시키는 코드

이는 http://lostechies.com/derekgreer/2009/03/01/implementing-inotifyproperychanged-with/

은 MEF 일을 설명하기 위해 다음과 같습니다 난 내가 다양한 실버 예에서 MEF를 사용하여 엮은에서 INotifyPropertyChanged 보았다 확신합니다. 나는 읽었을 때 그 부분에 관심이 없었다. 그러나 그것에 대해 읽지는 않았다.

인터페이스를 추출하고 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을 작성하십시오.

관련 문제