0

我正在使用TypeDescriptor.GetProperties(instance)它,它从基类返回所有属性和获取/设置方法。

我有基类:

public class Foo
{
    public virtual string Name
    {
      get => _name;
      set => _name = value;
    }
}

派生类:

public class Bar : Foo
{
    public override string Name => "Test";
}

当我获取“名称”属性的信息PropertyDescriptor.IsReadOnly等于“假”时,它应该是“真”。如何设置“PropertyDescriptor”以便它只返回派生类类型的数据?

4

1 回答 1

0

这与继承无关。PropertyDescriptor你得到的对象确实描述了Bar's 的属性。

IsReadOnly标志的事实false与继承无关。而是它告诉您该属性实际上不是只读的。

你可能会问“但是为什么?”

在您的代码中,您实际上只覆盖get了属性的访问器。访问器set实现只是从基Foo类继承而来。

您可以轻松编写如下内容:

Bar bar = new Bar();
bar.Name = "dummy";

这也将编译并在内部工作 -_name支持字段将设置为提供的值。

但是,此代码很危险,因为bar.Name无论"Test"您通过bar.Name = "string value here". 此外,该代码违反了 Liskov 替换原则,因为子类的行为Bar与基类的公共接口所声明的行为不同Foo

只读属性意味着您无法设置它的值,因此编译器甚至不允许您编写bar.Name = "text". 但它确实允许你这样做。您的情况下的属性不是只读的,它有一个错误的(损坏的)实现。

于 2017-09-22T12:58:25.087 回答