Доступ к закрытым полям и свойствам классов в C#

В большинстве случаев доступ к закрытым (private) членам класса из вне не требуется и более того в силу целого ряда объективных причин получать его не рекомендуется. Однако в некоторых случаях это может быть полезным.

В C# существует два способа получить доступ к закрытым членам (не считая открытых методов и свойств). Это доступ из вложенного класса и рефлексия.

В рамках данной статьи мы рассмотрим только доступ к полям и свойствам. Вызов закрытых методов будет рассмотрен отдельно.

Использование вложенных классов

В C# во вложенном классе в можно получить доступ к закрытым членам экземпляра внешнего класса, а также его статическим членам. В то же время доступ к закрытым членам вложенного класса из внешнего класса невозможен.

Пример:

Данный подход в силу своего архитектурного решения далеко не всегда удобен. Но, есть альтернатива в виде рефлексии.

Рефлексия

Рефлексия позволяет получать описание типов данных во время выполнения программы. Что в свою очередь даёт возможность получить доступ к закрытым членам. В данном случае к полям и методам.

Доступ к полям осуществляется при помощи класса FieldInfo. Для примера используем класс приведённый ранее.

Обратите внимание на флаги BindingFlags.NonPublic (член класса private, internal или protected) и BindingFlags.Instance (член класса не является статическим). Эти флаги необходимо обязательно передавать в метод GetField и притом совместно. Иначе доступ к полю не будет установлен.

Доступ к закрытому свойству при помощи класса PropertyInfo осуществляется аналогичным образом.

Если закрытое поле или свойство являются статическими, то нужно просто заменить флаг BindingFlags.Instance на BindingFlags.Static.

Пример для статического свойства:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *