0

我有一个Application需要用 INotifyPropertyChanged 事件覆盖的类。我已经编写了覆盖原始类并最终创建的逻辑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 容器(例如 prism)完成此操作。顺便说一句,我可能在这里完全错了,但我认为 MEF 也可能会有所帮助

另一种方法是使用 T4 模板查看代码生成,以反映现有类以生成您的超类以及映射到 4existing 的属性,该属性将包含触发事件的代码。

这看起来像 http://lostechies.com/derekgreer/2009/03/01/implementing-inotifyproperychanged-with/

解释 MEF 的事情:我很确定我已经看到 INotifyPropertyChanged 在各种 silverlight 示例中使用 MEF 进行了连接。当我阅读时,我对这方面不感兴趣,所以没有阅读它。

提取接口并使用 ioc 容器来完成所有繁重的工作将是我想象的最短路线。

于 2012-07-09T20:58:51.847 回答
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成员创建一个接口,那么您可以使您的SuperProspect和您的Prospect实现相同的接口。如果您随后对接口而不是具体Prospect实现进行编程,您的代码将同时使用SuperProspect和/或Prospect

于 2012-07-09T20:35:30.440 回答
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并使用它。

于 2012-07-09T21:21:13.497 回答
0

听起来您应该使用复制构造函数,将“来自原始类的数据”作为参数传递给新构造的superClass(顺便说一下,我认为名称Super- 可能是一个错误,因为这会让人们认为它在上面层次结构中的原始)。

通过复制构造函数,我的意思是:

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