我正在使用TypeDescriptor.GetProperties(instance),它从基类返回它的所有属性和get/set方法。
我有一个基类:
public class Foo
{
public virtual string Name
{
get => _name;
set => _name = value;
}
}派生类:
public class Bar : Foo
{
public override string Name => "Test";
}当我获取'Name‘属性的信息时,PropertyDescriptor.IsReadOnly等于'false',但它应该是'true’。我如何设置'PropertyDescriptor‘,让它只返回派生类类型的数据?
发布于 2017-09-22 20:58:25
这与继承无关。得到的PropertyDescriptor对象描述了Bar的属性。
IsReadOnly标志为false这一事实与继承无关。而是告诉你这个属性实际上是的,而不是只读的。
你可能会问“但是为什么呢?”
在您的代码中,您实际上只覆盖了属性的get访问器。只是从Foo基类继承了set访问器实现。
你可以很容易地写出这样的代码:
Bar bar = new Bar();
bar.Name = "dummy";这将编译并在内部工作- _name支持字段将被设置为所提供的值。
但是,此代码很危险,因为无论您通过bar.Name = "string value here"设置什么,bar.Name都将始终返回"Test"。此外,此代码违反了利斯科夫替换原则,因为子类Bar的行为与基类Foo的公共接口声明的行为不同。
只读属性意味着您不能设置它的值,因此编译器甚至不允许您编写bar.Name = "text"。但它确实允许你这样做。您的示例中的属性不是只读的,它有一个错误(损坏)的实现。
https://stackoverflow.com/questions/46364859
复制相似问题