Posiadanie zestawu, którego nie mogę zmodyfikować (dostarczonego przez dostawcę), który ma metodę zwracającą typ obiektu, ale w rzeczywistości jest typu wewnętrznego.
Jak mogę uzyskać dostęp do pól i / lub metod obiektu z mojego zestawu?
Należy pamiętać, że nie mogę modyfikować zespołu dostarczonego przez dostawcę.
W skrócie, oto co mam:
Od dostawcy:
internal class InternalClass
public string test;
end class
public class Vendor
private InternalClass _internal;
public object Tag {get{return _internal;}}
end class
Z mojego zespołu przy użyciu zestawu dostawcy.
public class MyClass
{
public void AccessTest()
{
Vendor vendor = new Vendor();
object value = vendor.Tag;
// Here I want to access InternalClass.test
}
}
InternalsVisibleTo
ale nie obejmowali twojego zestawu? Jeśli symbol nie jest naprawdę ukryty, jest częścią ABI.Widzę tylko jeden przypadek, w którym pozwoliłbyś ujawnić swoim członkom wewnętrznym innym zgromadzenie, a to jest w celach testowych.
Mówiąc, że istnieje sposób, aby umożliwić zespołom „znajomych” dostęp do elementów wewnętrznych:
W pliku AssemblyInfo.cs projektu dodajesz wiersz dla każdego zespołu.
te informacje są dostępne tutaj.
Mam nadzieję że to pomoże.
źródło
Chciałbym spierać się o jedną kwestię - że nie można rozszerzyć oryginalnego zespołu - za pomocą Mono.Cecil można wstrzyknąć
[InternalsVisibleTo(...)]
do zespołu 3pty. Zwróć uwagę, że mogą mieć konsekwencje prawne - mieszasz się z 3pty montażem i implikacjami technicznymi - jeśli zestaw ma silną nazwę, musisz go rozebrać lub ponownie podpisać innym kluczem.A kod taki jak:
źródło
Odbicie.
Używaj tej mocy mądrze. Nie zapomnij o sprawdzaniu błędów. :)
źródło
Nie możesz. Klasy wewnętrzne nie mogą być widoczne poza ich montażem, więc nie ma jawnego sposobu, aby uzyskać do nich bezpośredni dostęp - oczywiście AFAIK. Jedynym sposobem jest użycie późnego wiązania środowiska uruchomieniowego za pośrednictwem odbicia, a następnie można pośrednio wywoływać metody i właściwości z klasy wewnętrznej.
źródło