0

ApplicationINotifyPropertyChanged イベントでオーバーライドする必要があるクラスがあります。元のクラスをオーバーライドするロジックを作成し、最終的に作成しましたSuperApplication

ただし、ライブラリからデータを取得していますが、読み込みロジックを変更できません。元のクラスからスーパークラスにデータを取得する方法が必要なだけです。のようなことを試しましたが、うまくいきませ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));
        }
    }
}
4

4 に答える 4

0

あなたのコメントと編集を考えると、私は新しい答えを出す必要があります笑-私は誤解しました

おそらく制御できないプロパティにイベントハンドラーを追加するには、インターセプトを使用する必要があります。個人的には、これがプリズムなどの IoC コンテナーで行われているのを見てきました。私はここで完全に間違っているかもしれませんが、MEFも役立つと思います

もう 1 つの方法は、T4 テンプレートを使用してコード生成を調べ、既存のクラスを反映して、スーパークラスと、イベントを発生させるコードを含む 4existing にマップされるプロパティを生成することです。

これはhttp://lostechies.com/derekgreer/2009/03/01/implementing-inotifyproperychanged-with/のように見えます

MEF のことを説明するには、さまざまな Silverlight の例で INotifyPropertyChanged が MEF を使用して接続されているのを見たことがあると確信しています。私が読んでいたとき、私はその側面に興味がなかったので、それを読みませんでした.

インターフェイスを抽出し、ioc コンテナーを使用してすべての重い作業を行うことが、私が想像する最短ルートです。

于 2012-07-09T20:58:51.847 に答える
0

コピーコンストラクターを使用して、「元のクラスからのデータ」をパラメーターとして新しく構築されたものに渡す必要があるようですsuperClass(ちなみに、名前Superはおそらく間違いだと思います階層内のオリジナル)。

コピー コンストラクターとは、次のような意味です。

class IWishIWasntCalledSuperApplication : Application 
{
  IWishIWasntCalledSuperApplication(Application original) 
  { 
      this.someData = original.someData;
      this.someOtherData = original.someOtherData;
      ...etc...
  }
}
于 2012-07-09T20:31:20.803 に答える
0

INotifyPropertyChangedに直接実装することはできないと思いますProspect。直接変更できない場合Prospect( make all your properties など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メンバー用のインターフェースを作成すると、あなたSuperProspectとあなたのProspect実装の両方で同じインターフェースを作成できます。次に、具体的な実装ではなくインターフェースに対してプログラミングするとProspect、コードはSuperProspectおよび/またはの両方で機能しますProspect

于 2012-07-09T20:35:30.440 に答える
0

ロードがオブジェクトの構築中だったのか、それともその後のメソッド呼び出し中だったのかはわかりませんでした。どちらに応じて、次の 2 つのコード サンプルのいずれかのようになります。

//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します。

于 2012-07-09T21:21:13.497 に答える