c#property override Set方法

时间:2010-12-01 23:55:47

标签: c# reflection

我有一个类似下面的类,我想覆盖“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。

5 个答案:

答案 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";
        }
    }
}