我有一个类Application
,我需要用INotifyPropertyChanged事件覆盖它。我编写了覆盖原始类的逻辑,最终创建了SuperApplication
我从库中提取数据,但无法更改加载逻辑。我只需要一种方法将原始类中的数据导入我的superClass。我尝试过像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 :(得分:0)
听起来你应该使用一个复制构造函数,将“原始类中的数据”作为参数传递给新构造的superClass
(顺便提一下,我认为名称Super
- 是可能是一个错误,因为这会让人们认为它高于层次结构中的原始文件。
通过copy-constructor,我的意思是:
class IWishIWasntCalledSuperApplication : Application
{
IWishIWasntCalledSuperApplication(Application original)
{
this.someData = original.someData;
this.someOtherData = original.someOtherData;
...etc...
}
}
答案 1 :(得分: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
。
答案 2 :(得分:0)
鉴于你的评论和编辑,我需要给出一个新答案大声笑 - 我误解了
您需要使用拦截将事件处理程序添加到您无法控制的属性。就个人而言,我已经看到过使用像棱镜这样的IoC容器。我可能在这里完全错了,但我认为MEF也可以提供帮助
另一种方法是使用T4模板查看代码生成,以反映现有类以生成超类以及映射到4existing的属性,这些属性将包含触发事件的代码。
这看起来像 http://lostechies.com/derekgreer/2009/03/01/implementing-inotifyproperychanged-with/
解释MEF的事情:我很确定我已经看到在各种Silverlight示例中使用MEF连接的INotifyPropertyChanged。我读书时对这方面不感兴趣,所以没有读过它。
提取界面并使用ioc容器完成所有繁重的操作将是我想象的最短路径。
答案 3 :(得分: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
并使用它。