2013-06-28 3 views
4

следующие мои коды:получить частный сеттер свойство в пределах наследования

class Foo 
{ 
    public string Bar { get; private set; } 
} 

и

var prop = typeof(Foo).GetProperty("Bar"); 
if (prop != null) 
{ 
    // The property exists 
    var setter = prop.GetSetMethod(true); 
    if (setter != null) 
    { 
     // There's a setter 
     Console.WriteLine(setter.IsPublic); 
    } 
} 

да, как вы можете себе представить, это работает совершенно правильно. но когда приходит наследство, вещи разные:

class Foo 
{ 
    public string Bar { get; private set; } 
} 

class A : Foo 
{ 

} 

конечно я изменил эту строку:

var prop = typeof(Foo).GetProperty("Bar"); 

к

var prop = typeof(A).GetProperty("Bar"); 

тогда, связующий получает нулевое значение, и консоль ничего не печатайте!

так ... почему?

btw, есть ли какое-нибудь обходное решение, чтобы это произошло или было совершенно другим способом?

любая помощь будет оценена. Благодарю.

ответ

2

так ... почему?

Насколько A обеспокоен, Bar только для чтения - вы не можете назвать сеттер от A, так что имеет смысл, что нет никакого сеттера, когда вы просите собственности относительно A.

Один из вариантов заключается в том, чтобы использовать флаги привязки, чтобы запрашивать только свойства - и пройдите путь до цепи наследования, пока не найдете фактическую декларацию свойства. Немного странно, что вы должны это делать, но это делает определенный смысл, так как свойство действительно - это разные в зависимости от того, приходите ли вы к нему из контекста объявляющего класса или нет.

Я удивлен от этого поведения - но не шокирован.

0

Вы можете установить частную собственность с отражением, используя метод SetValue в информации о свойствах, даже если вы не можете получить метод set.

3

Общее решение назвать

var prop = GetType().GetProperty("Bar").DeclaringType.GetProperty("Bar"); 

, который не очень интуитивно, я согласен.

+0

Возможно, вам нужна рекурсия. иерархия может быть любой возможной. – pinopino

+0

no, если вы не используете 'новый' оператор на некотором уровне вашей иерархии, вы всегда получаете' typeof (Foo) 'при вызове' DeclaringType' для свойства 'Bar'. На самом деле, даже если вы используете 'new', это может сработать. –

+0

Я пишу код для подтверждения и да, вы правы.но, когда я использую «новый» оператор, DeclaringType снова не был типом (Foo), его тип (A), ниже был мой код (только иерархия): 'class Foo {public string Bar {get ; частный набор; } } класс A: Foo { Публичная новая строка Bar {get; частный набор; } } класс B: A { } – pinopino