我有一个类似下面的类,我想覆盖“School,Country..etc ..”属性的设置值,当有人设置一个值时,我不想改变学生班但我需要在基类中执行它并将其用作通用方法
public class Student : BaseClass
{
public String School { get; set; }
public String Country{ get; set; }
}
即:
当有人设定
Student.School="Harvard"
,
我需要将它存储为
Student.School="Harvard my custom value"
;
注意: 基本上在基类而不是主类中调用OnPropertyChanged。
答案 0 :(得分:1)
如果您想使用方面,请尝试Postsharp
答案 1 :(得分:0)
基本上你不能覆盖非虚拟财产。您可以在派生类中使用相同名称的其他属性隐藏它,但如果某些其他代码通过对基类的引用访问您的对象,则不会产生所需的效果。
答案 2 :(得分:0)
public class Student : BaseClass
{
private string _school
public string School
{
get { return _school; }
set
{
if(value == "Harvard")
value = "Harvard custom";
_school = value;
}
}
public String Country{ get; set; }
}
是你的意思吗?
如果School
属性位于BaseClass
,那么您可以使用new
关键字,或者如果您控制BaseClass
,则可以添加virtual
1}}关键字指向School
属性,override
位于Student
类。
答案 3 :(得分:0)
仅仅修改BaseClass
是不可行的。以这种方式思考:如果可以轻松地“注释”自动属性,那么我们就不需要所有那些< rant>毫无用量的< / rant>实现INotifyPropertyChanged的数据模型类的手动属性实现(对于DependencyProperties也是如此)。
您需要在您的基类可以使用的子类中提供钩子。实现你已经提到的PropertyChanged是一种可能的解决方案,另一种方法是简单的方法调用:
public class Student : BaseClass
{
private string _school;
public String School
{
get { return _school; }
set {
_school = value;
DoMoreChanges(ref _school); // DoMoreChanges is defined in BaseClass
}
}
public String Country{ get; set; }
}
如果您有许多需要此类的子类,您可以使用Visual Studio代码片段来创建代码或T4 templates。
答案 4 :(得分:0)
由于您的基类没有这些属性,因此您将无法使用标准OOD模式或原则从基类中修改它们。
现在,如果将属性作为普通属性或虚拟属性移动到基类,则可以修改在属性的set块中执行的操作,以执行额外的工作。
但是如果你不能将这些移动到基类,并且你不能修改Student类,就像你似乎暗示在你的问题中,那么你可以将学生类封装在像StudentProxy之类的新类中,然后拥有它公开类似的属性,然后按照你想要的方式调用真正的学生课程。
例如:
public class StudentProxy
{
private Student _student;
public StudentProxy(Student student)
{
this._student = student;
}
public String School
{
get { return _student.School; }
set
{
_student.School = value + " my custom value";
}
}
public String Country
{
get { return _student.Country; }
set
{
_student.Country = value + " my custom value";
}
}
}