2017-09-22 10 views
0

나는 TypeDescriptor.GetProperties(instance)을 사용하고 있으며 모든 속성을 가져오고 기본 클래스에서 가져 오기/가져 오기 메서드를 반환합니다.PropertyDescriptor and inheritance

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'가 derrived 클래스 유형에 대해서만 데이터를 반환하도록 설정할 수 있습니까?

+0

[클래스의 반사 속성으로 가져 오기는 가능하지만 상속 된 클래스에서는 가져올 수 없습니다] (https://stackoverflow.com/questions/7596162/get-by-reflection-properties-of-class-but-not-from) 가능한 중복 -inherited-class) –

+0

@BradleyUffner 아니, 그건 내 경우가 아니야. – Sigin

+0

아, 죄송합니다, 네 말이 맞다. 가까운 투표를 철회했습니다. –

답변

0

이것은 상속과는 아무 관련이 없습니다. PropertyDescriptor 개체는 입니다.Bar 속성을 나타냅니다.

IsReadOnly 플래그가 false이라는 사실은 상속과는 아무런 관련이 없습니다. 그러나 실제로 그것은 속성이 사실은 읽기 전용이 아니라고 알려줍니다.

"왜?"라고 묻는 중입니다.

코드에서 실제로 속성의 접근 자 get 만 재정의합니다. set 액세서 구현은 기본 Foo 클래스에서 상속됩니다. 너무 내부적으로 작업이 컴파일

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

과 - _name 백업 필드는 제공된 값으로 설정됩니다 :

당신은 쉽게 뭔가를 쓸 수 있습니다.

그러나 bar.Namebar.Name = "string value here"을 통해 설정 한 내용과 관계없이 항상 "Test"을 반환하므로 위험합니다. 또한이 코드는 자식 클래스 Bar의 동작이 기본 클래스 Foo의 공용 인터페이스에서 설명한 것과 다르므로 Liskov 대체 원칙을 위반합니다.

읽기 전용 속성은 값을 설정할 수 없다는 것을 의미하므로 컴파일러에서는 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