首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PropertyDescriptor和继承

PropertyDescriptor和继承
EN

Stack Overflow用户
提问于 2017-09-22 20:28:58
回答 1查看 596关注 0票数 0

我正在使用TypeDescriptor.GetProperties(instance),它从基类返回它的所有属性和get/set方法。

我有一个基类:

代码语言:javascript
复制
public class Foo
{
    public virtual string Name
    {
      get => _name;
      set => _name = value;
    }
}

派生类:

代码语言:javascript
复制
public class Bar : Foo
{
    public override string Name => "Test";
}

当我获取'Name‘属性的信息时,PropertyDescriptor.IsReadOnly等于'false',但它应该是'true’。我如何设置'PropertyDescriptor‘,让它只返回派生类类型的数据?

EN

回答 1

Stack Overflow用户

发布于 2017-09-22 20:58:25

这与继承无关。得到的PropertyDescriptor对象描述了Bar的属性。

IsReadOnly标志为false这一事实与继承无关。而是告诉你这个属性实际上是的,而不是只读的。

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

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

你可以很容易地写出这样的代码:

代码语言:javascript
复制
Bar bar = new Bar();
bar.Name = "dummy";

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

但是,此代码很危险,因为无论您通过bar.Name = "string value here"设置什么,bar.Name都将始终返回"Test"。此外,此代码违反了利斯科夫替换原则,因为子类Bar的行为与基类Foo的公共接口声明的行为不同。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46364859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档