C # – Как получить доступ к внутреннему classу из внешней сборки

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

Как я могу получить доступ к полям и / или методам объекта из моей сборки?

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

По сути, вот что я имею:

От поставщика:

internal class InternalClass public string test; end class public class Vendor private InternalClass _internal; public object Tag {get{return _internal;}} end class 

Из моей сборки, используя сборку поставщика.

 public class MyClass { public void AccessTest() { Vendor vendor = new Vendor(); object value = vendor.Tag; // Here I want to access InternalClass.test } } 

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

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

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

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

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

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

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

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

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

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

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

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

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

    Отражение.

     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); 

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

    Хотелось бы утверждать, что вы не можете увеличить исходную сборку – с помощью Mono.Cecil вы можете ввести [InternalsVisibleTo(...)] в сборку 3-го порядка. Обратите внимание, что могут быть юридические последствия – вы возитесь с сборкой 3-х сторон и техническими последствиями – если assembly имеет сильное имя, вам либо нужно снять ее, либо переписать ее другим ключом.

      Install-Package Mono.Cecil 

    И код вроде:

     static readonly string[] s_toInject = { // alternatively "MyAssembly, PublicKey=0024000004800000... etc." "MyAssembly" }; static void Main(string[] args) { const string THIRD_PARTY_ASSEMBLY_PATH = @"c:\folder\ThirdPartyAssembly.dll"; var parameters = new ReaderParameters(); var asm = ModuleDefinition.ReadModule(INPUT_PATH, parameters); foreach (var toInject in s_toInject) { var ca = new CustomAttribute( asm.Import(typeof(InternalsVisibleToAttribute).GetConstructor(new[] { typeof(string)}))); ca.ConstructorArguments.Add(new CustomAttributeArgument(asm.TypeSystem.String, toInject)); asm.Assembly.CustomAttributes.Add(ca); } asm.Write(@"c:\folder-modified\ThirdPartyAssembly.dll"); // note if the assembly is strongly-signed you need to resign it like // asm.Write(@"c:\folder-modified\ThirdPartyAssembly.dll", new WriterParameters { // StrongNameKeyPair = new StrongNameKeyPair(File.ReadAllBytes(@"c:\MyKey.snk")) // }); } 

    Ну, ты не можешь. Внутренние classы не могут быть видны за пределами их сборки, поэтому нет прямого доступа к нему напрямую – АФАИК, конечно. Единственный способ – использовать позднюю привязку во время выполнения через reflection, тогда вы можете косвенно ссылаться на методы и свойства из внутреннего classа.

    Interesting Posts

    jQuery одно и то же событие click для нескольких элементов

    Как получить полный путь к ресурсу в Windows?

    Разрешения на доступ к файлам IIS AppPoolIdentity и файловой системы

    Stealth Ports даже при общении?

    Java 8 метод ссылки необработанное исключение

    Как я могу использовать JavaPOS для печати reciepts с помощью принтера Epson?

    AngularJS $ watch vs $ watchCollection: что лучше для производительности?

    Обход проблемы из-за отсутствия оператора ‘nameof’ в C # для безопасного хранения данных по типу?

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

    Как отключить копирование текстового стиля в Windows XP?

    Как сгруппировать RadioButton из разных LinearLayouts?

    Как увеличить / уменьшить объект UIImage, когда пользователь зажимает экран?

    Использование 7-Zip из Delphi?

    Подробное объяснение смены переменных в закрытии

    Как копировать только новые файлы И только те, которые были изменены после определенной даты?

    Давайте будем гением компьютера.