2017-09-22 100 views
0

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

我有基类:

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

Derrived类:

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

当我得到了 '名称' 属性PropertyDescriptor.IsReadOnly信息等于 '假',但它应该是“真”。 我该如何设置'PropertyDescriptor',这样它会返回我的数据只用于耙类类型?

+0

可能重复[获取通过类的反射属性,但不是从继承类](https://stackoverflow.com/questions/7596162/get-by-reflection-properties-of-class-but-not-from -herherited-class) –

+0

@BradleyUffner nope,那不是我的情况。 – Sigin

+0

啊,对不起,你说得对。撤回近距离投票。 –

回答

0

这与继承无关。 PropertyDescriptor对象你得到确实描述Bar的财产。

IsReadOnly标志为false的事实与继承无关。而是它告诉你,该属性是其实不是只读。

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

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

您可以轻松地编写类似:

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

这将汇编和内部做工太 - _name支持字段将被设置为提供的值。

但是,由于bar.Name将始终返回​​,无论您通过bar.Name = "string value here"设置了什么,此代码都是危险的。此外,该代码打破了Liskov替换原则,因为子类Bar的行为与基类Foo的公共接口所述的行为不同。

A 只读属性意味着你不能设置它的值,所以编译器甚至不会允许你写bar.Name = "text"。但它确实可以让你做到这一点。你的情况属性不是只读的,它有一个错误的(破碎的)实现。

+0

OK。让我们认为它不是只读的,比我调用InstanceOfTypeBar.GetType()。GetProperty(“Name”).CanWrite'应该是'true',但实际上它是'false'。 – Sigin

+0

@Sigin,你可以看看[这里](https://stackoverflow.com/questions/8140298/strange-effect-with-overridden-properties-and-reflection)。您的财产是**不**只读,'CanWrite'的错误值是一个副作用。 – dymanoid

+0

我明白你的意思,但它不能解决我的问题。 – Sigin