Как я могу получить доступ к частной теневой константе из базового класса? - PullRequest
1 голос
/ 05 января 2012

Это код:

void Main()
{
    Base.Title.Dump("Base");             // displays "Base Title"
    Child.Title.Dump("Child");           // displays "Base Title"

    Base baseClass = new Base();
    Base childClass = new Child();       // "InvalidOperationException" would be thrown
}

class Base {
    public const string Title = "Base Title";

    public string ClassTitle { get; set; }

    public Base() {
        Type type = this.GetType();

        type.GetFields()
            .First(item => item.Name == "Title")
            .GetValue(this).Dump();
    }
}

class Child : Base {
    private new const string Title = "Child Title";
}

Исключение "InvalidOperationException" выдается в конструкторе Base.

Ответы [ 5 ]

1 голос
/ 05 января 2012

Если вам нужен производный класс Title, вам нужно либо сделать публичным заголовок дочернего класса 'Title, либо грубо взломать его закрытые члены с помощью чего-то вроде этого:

Console.WriteLine((type.GetFields(
    System.Reflection.BindingFlags.NonPublic | 
    System.Reflection.BindingFlags.Static)
    .First(item => item.Name == "Title"))
    .GetValue(this));

Если вы хотите базовый класс Title, тогда ваша строка:

Type type = this.GetType();

получает производный тип, когда вам нужен базовый тип.

Попробуйте вместо этого:

Type type = typeof(Base);
1 голос
/ 05 января 2012

Доступ к нему работает, просто найдите, если вы не делаете это с помощью отражения.

Title.Dump();
1 голос
/ 05 января 2012

Попробуйте это

(type.GetFields().First(item => item.Name == "Title")).GetValue(this);
0 голосов
/ 05 января 2012

Вам необходимо использовать перегрузку GetFields, которая указывает частные, статические поля:

type.GetFields(BindingFlags.Static | BindingFlags.NonPublic)
            .First(item => item.Name == "Title")
            .GetValue(null).Dump();

Тем не менее, это очень плохая идея. Подумайте об использовании атрибутов для связи метаданных, а не об использовании отражения для доступа к частным константам.

0 голосов
/ 05 января 2012

Согласно MSDN , GetFields () возвращает только открытые поля по умолчанию.Попробуйте использовать перегрузку с BindingFlags.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...