bsb25 Ответов: 3

доступ к непубличным членам


Как мы получаем доступ к непубличным членам?

У меня есть объект под названием doseSuggestiions, который имеет непубличный член, называемый "частоты"

Я хочу получить доступ к тому же самому.

Пожалуйста помогите мне в этом

bsb25

может ли кто-нибудь привести примеры

3 Ответов

Рейтинг:
1

walterhevedeich

В принципе, у нас есть 4 модификатора доступа в C#. public, protected, internal и private. Вот определения для каждого модификатора:

1. The общественный [^] ключевое слово-это модификатор доступа для типов и членов типа. Публичный доступ-это самый разрешительный уровень доступа. Нет никаких ограничений на доступ к публичным членам.

2. The защищенный[^] ключевое слово-это модификатор доступа к элементу. Защищенный член доступен из класса, в котором он объявлен, и из любого класса, производного от класса, объявившего этот член.

3. The внутренний[^] ключевое слово-это модификатор доступа для типов и членов типа. Внутренние элементы доступны только в файлах одной сборки. Обычно внутренний доступ используется в компонентной разработке, поскольку он позволяет группе компонентов взаимодействовать частным образом, не подвергаясь воздействию остального кода приложения. Например, фреймворк для построения графических пользовательских интерфейсов может предоставлять классы управления и формы, которые взаимодействуют с помощью членов с внутренним доступом. Поскольку эти члены являются внутренними, они не подвергаются воздействию кода, использующего фреймворк.

4. The частный[^] ключевое слово-это модификатор доступа к элементу. Частный доступ-это наименее разрешительный уровень доступа. Закрытые члены доступны только в теле класса или структуры, в которой они объявлены

Короче говоря, в зависимости от непубличной переменной существуют различные уровни доступности для ваших членов.


Sergey Alexandrovich Kryukov

- Нет! Существует 5 (пять) различных спецификаторов доступа (не ключевые слова, а спецификаторы доступа). Кто может назвать их всех, тот и есть хороший мальчик. Прочтите стандарт C#.
Кроме того, это не дает ответа на вопрос ОП-совсем нет.
--СА

walterhevedeich

Да, вы правы, я пропустил внутреннюю защиту. Спасибо, что предупредил. И вы снова правы в том, что не ответили на вопрос опа. Вопрос не настолько ясен, поэтому я решил дать ответ, который может(надеюсь) помочь ему выяснить это самому. :)

Sergey Alexandrovich Kryukov

Спасибо за понимание.

Похоже, что OP уже знаком со спецификаторами доступа.

Я ответил О доступе, пожалуйста, смотрите. (Я подумал, что это заслуживает полного формального ответа, хотя использование OP может быть или не быть практичным.)
--СА

Рейтинг:
0

Tarak Vandara

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


Sergey Alexandrovich Kryukov

Вопрос был о непубличности. Вы знаете, как получить к нему доступ?

Если нет, пожалуйста, посмотрите мой ответ. (Я не говорю, что это практично. Он используется в относительно редких случаях, таких как плагины...)
--СА

Рейтинг:
0

Sergey Alexandrovich Kryukov

Есть только один способ получить доступ к непубличным членам: рефлексия. Проблема в том, что этот метод гораздо менее поддается поддержке. Например, вы можете найти элемент по имени, но если вы неправильно наберете строку или имя будет изменено позже, проверка времени компиляции не предупредит вас-вы не найдете элемент. Вы можете найти все члены вместе как полиморфный массив членов или отдельно все поля, все свойства, все события, все методы, все конструкторы или реализованные интерфейсы. Вы можете ограничить поиск публичными или непубличными участниками.

Используйте следующие методы System.Type: FindInterfaces, GetInterface, GetInterfaces, GetMember, GetMembers, GetMethod, GetMethods, GetProperty, GetProperties, GetEvent, GetEvents, GetConstructorImpl, GetConstructor.

Видеть http://msdn.microsoft.com/en-us/library/system.type.aspx[^].

Чтобы найти непубличные методы, вам нужно использовать версии "Get..."использование метода System.Reflection.BindingFlags параметр; использование System.Reflection.BindingFlags.NonPublic или System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public

—СА


bsb25

я попытался использовать код ffollowing,но он выдал ошибку "экземпляр объекта не ser для ссылки на onject"

Доза doseProperty = новая доза();
Тип type = typeof(доза );
Доза[] doseSuggestions=продукт.GetDoseSuggestions(pInfo, false);
FieldInfo fInfo = doseSuggestions[0].Метод gettype().Getfield у("databaseDoseText");
строка s = (String)fInfo.GetValue(doseProperty);

Sergey Alexandrovich Kryukov

Мне нужно увидеть стек исключений, чтобы ответить на этот вопрос, но... Я вижу.
Хорошо, предупреждение, которое я дал вам в моем первом абзаце, работает, а также моя инструкция использовать BindingFlags-вы не смогли его использовать. Твоя проблема-Гетфилд. В этой форме он пытается найти только открытые поля. Как вы говорите, вы ищете непубличный, он возвращает null.

Другая проблема: вы принимаете этот тип дозы, но позже игнорируете его и принимаете тип doseSuggestions[0]. (Кстати, откуда вы знаете, что doseSuggestions[0] существует? Это не является источником проблемы, так как это было бы исключение "вне диапазона"). Что такое тип doseSuggestions[0]? Это может быть доза, но также и класс, производный от дозы, я не знаю.

--СА

Chil Umez

Является ли этот массив (doseSuggestions) нулевым???
или doseSuggestions[0] равно нулю???

Sergey Alexandrovich Kryukov

Мне нужно увидеть декларацию, чтобы ответить на этот вопрос. Если бы он был в исполняемом файле без исходного кода, Вы могли бы отразить его тип и посмотреть. У меня нет такой информации. Есть ли у вас исходный код, объявляющий этот тип. Если это и массив, то также его тип(ы) элемента.
--СА

Albin Abel

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

Sergey Alexandrovich Kryukov

Да, вы можете получить доступ и выполнить его! Просто попробуйте (или доверьтесь). В принципе, для рефлексии нет никакой разницы-она получает доступ ко всему этому одним и тем же способом.
Я уверен на 100% - я делаю это постоянно. Это часть моей архитектуры плагинов и других вещей.
--СА