C # - Внутренние свойства «читаемые» в QuickWatch, но не с использованием отражения? - PullRequest
4 голосов
/ 12 марта 2012

Я вижу, что в окне «Быстрый просмотр» есть доступ ко всем свойствам, независимо от ограничений доступа (внутренних, защищенных, закрытых) для класса в библиотеке, даже когда на библиотеку ссылаются в совершенно другом приложении, lib иПространство имен.Принимая во внимание, что я не нахожу способ получить к ним доступ, используя «отражение».Я особенно пытаюсь «прочитать» (заметьте - просто прочитайте) внутреннее свойство сборки.Если это невозможно из-за того, как работает «внутреннее» (недоступно вне того же пространства имен), почему оно «читается» окном «Быстрый просмотр» в VS.NET?

Пример кода, который я использовал:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestLib
{
    public class TestInteralProp
    {
        internal string PropertyInternal
        {
            get { return "Internal Property!";  }
        }

        protected string PropertyProtected
        {
            get { return "Protected Property!"; }
        }

        string PropertyPrivate
        {
            get { return "Private Property!"; }
        }

        public string PropertyPublic
        {
            get { return "Public Property!";  }
        }

        protected internal string PropertyProtectedInternal
        {
            get { return "Protected Internal Property!"; }
        }
    }
}

Когда я создаю объект для класса TestInernalProp, я могу видеть все 4 свойства в quickwatch -

props

И когда яиспользовать отражение для доступа к любому из них, кроме общедоступного свойства (PropertyPublic), я получаю исключение нулевой ссылки.

//this works
propTestObj.GetType().InvokeMember("PropertyPublic", System.Reflection.BindingFlags.GetProperty, null, propTestObj, null);
//this fails (obviously)
propTestObj.GetType().InvokeMember("PropertyInternal", System.Reflection.BindingFlags.GetProperty, null, propTestObj, null);

//this works
propTestObj.GetType().GetProperty("PropertyPublic").GetValue(propTestObj, null);
//this fails again
propTestObj.GetType().GetProperty("PropertyInternal").GetValue(propTestObj, null)

Мне неясно, как "Quick Watch" могут получить к ним доступ.

1 Ответ

12 голосов
/ 12 марта 2012

Используйте эти флаги

BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance

Флаг GetProperty не требуется для этой операции.Возможно, вы захотите добавить также Static.

Примечание. Вы можете комбинировать флаги с |, потому что их целочисленные значения имеют степень двойки.См. этот ответ SO .


ПРИМЕЧАНИЕ (В ответ на озабоченность Лалмана и Шэнкса вопросами безопасности в Reflection)

Всегда естьспособ написать плохой или опасный код.Это зависит от вас, делать это или нет.Отражение не является обычным способом ведения дел, скорее оно предназначено для программирования специальных инструментов, таких как o / r-mappers или инструменты анализа.Отражение очень сильно;однако, вы должны использовать это с умом.

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