Как я могу получить доступ к внутреннему классу от внешнего блока?

У меня была та же проблема при запуске Android Studio 1.5.1 для Windows 8.1 (64-разрядная версия), и я решил ее, добавив следующие две системные переменные среды:

SLAVE_AAPT_TIMEOUT = 30
JAVA_HOME = C:\Program Files\Java\jdk1.8.0_65

( Обратите внимание: : путь к системной переменной среды JAVA_HOME зависит от того, где находится ваш JDK и что версия вашего JDK может отличаться от приведенного выше примера).

93
задан Liam 12 September 2018 в 10:56
поделиться

4 ответа

Без доступа к типу (и без «InternalsVisibleTo» и т. Д.) Вам пришлось бы использовать отражение. Но лучше задать вопрос: следует ли получать доступ к этим данным? Это не часть контракта открытого типа ... мне кажется, что он предназначен для обработки как непрозрачный объект (для их целей, а не для вас).

Вы описали его как поле общедоступного экземпляра ; чтобы получить это через отражение:

object obj = ...
string value = (string)obj.GetType().GetField("test").GetValue(obj);

Если это на самом деле свойство (а не поле):

string value = (string)obj.GetType().GetProperty("test").GetValue(obj,null);

Если оно не является общедоступным, вам нужно использовать перегрузку BindingFlags для GetField / GetProperty .

Важное замечание : будьте осторожны с подобным отражением; реализация может измениться в следующей версии (нарушая ваш код) или она может быть запутана (нарушая ваш код), или вам может не хватить «доверия» (нарушение кода). Вы замечаете закономерность?

82
ответ дан 24 November 2019 в 06:12
поделиться

Отражение.

using System.Reflection;

Vendor vendor = new Vendor();
object tag = vendor.Tag;

Type tagt = tag.GetType();
FieldInfo field = tagt.GetField("test");

string value = field.GetValue(tag);

Используйте силу с умом. Не забывайте о проверке ошибок. :)

3
ответ дан 24 November 2019 в 06:12
поделиться

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

-2
ответ дан 24 November 2019 в 06:12
поделиться

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

Говоря о том, что существует способ разрешить доступ к сборкам «Друг» для внутренних:

В файле AssemblyInfo.cs проекта вы добавляете строку для каждой сборки.

[assembly: InternalsVisibleTo("name of assembly here")]

эта информация доступна здесь.

Надеюсь, это поможет.

203
ответ дан 24 November 2019 в 06:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: