Czy istnieje sposób na dziedziczenia z wewnętrznej klasy abstrakcji w dynamicznie generowanej klasie środowiska wykonawczego (na przykład za pomocą odbicia) przy użyciu programu .NET Framework 4.0?Dynamicznie dziedziczy z klasy wewnętrznej przez odbicie
Odpowiedz
Z ogólnego poczucia perwersji wobec rzeczy, które nie powinny być możliwe, rzuciłem okiem na to, jak daleko chciałbym spróbować stworzyć klasę odziedziczoną po System.CurrentSystemTimeZone
(klasa wewnętrzna w mscorlib). Dostajemy aż do stworzenia TypeBuilder
, ale kiedy zadzwonisz pod numer CreateType
, wyśle on TypeLoadException
z komunikatem "Odmowa dostępu:" System.CurrentSystemTimeZone "."
Trochę więcej skrzypiec doprowadziło mnie do wniosku, że można utworzyć zespół dynamicznie, który miał silną nazwę, która zidentyfikowała go jako zespół znajomych zespołu, w którym zdefiniowano typ wewnętrzny. Ale wtedy, w takim wypadku, możesz napisać kod class Foo : CurrentSystemTimeZone
, nie pozostawiając żadnych sztuczek.
Zresztą kod o ile linia, która rzuca się poniżej, na wypadek gdyby ktoś jest w nastroju do próbując niektóre nawet bardziej przewrotny wariant tego pomysłu i chce punkt początkowy:
using System;
using System.Reflection;
using System.Reflection.Emit;
using System.Threading;
namespace ReflectPerversely
{
class SuicidallyWrong
{
private static ModuleBuilder mb;
public static Assembly ResolveEvent(Object sender, ResolveEventArgs args)
{
return mb.Assembly;
}
public static void Main(string[] args)
{
Assembly sys = Assembly.GetAssembly(typeof(string));
Type ic = sys.GetType("System.CurrentSystemTimeZone",true);
AssemblyName an = new AssemblyName();
an.Name = "CheatingInternal";
AssemblyBuilder ab = Thread.GetDomain().DefineDynamicAssembly(an, AssemblyBuilderAccess.RunAndSave);
mb = ab.DefineDynamicModule("Mod", "CheatingInternal.dll");
AppDomain currentDom = Thread.GetDomain();
currentDom.TypeResolve += ResolveEvent;
TypeBuilder tb = mb.DefineType("Cheat", TypeAttributes.NotPublic | TypeAttributes.Class, ic);
Type cheatType = tb.CreateType();
}
}
}
Nie możesz. Możesz używać typów, które nie są publiczne, używając Assembly.GetType()
, ale nie możesz ich dziedziczyć. Jon Skeet explains in this article Dlaczego generalnie nie jest dostępny dostęp do członków niepublicznych i odpowiedź na pytanie bardziej dogłębnie niż ja.
Możesz uzyskać dostęp do wewnętrznych typów poprzez odbicie. –
@YuriyFaktorovich Możesz uzyskać do nich dostęp, ale o ile wiem, nie możesz ich odziedziczyć. – aevitas
Zgaduję, że możesz używać ILGeneratora, ale jeszcze go nie wypróbowałeś. –
Na pewno możesz i nie potrzebujesz do tego refleksji. Dziedziczona klasa musi znajdować się w tym samym zespole :)
Można również ustawić przyjaźń między złożeniami: http://msdn.microsoft.com/en-us/library/0tke9fxk%28v=VS.100%29.aspx, co umożliwi dostęp do klas wewnętrznych jednego zespołu. To podejście jest czasem przydatne w tworzeniu zespołów testów jednostkowych wymagających wewnętrznego dostępu do testowanych zespołów.
+1 dla wartości entertainmet. Ale nie można nawiązać przyjaźni poprzez refleksję, więc nie jest to zbyt przydatne dla EOG. –
Interpretuję "ex." jako "na przykład", więc refleksja może nie być trudnym wymogiem. – surfen
Dobra uwaga ... Domyślam się, że @EOG powinien uzyskać -1 dla tytułu, który nie pasuje do pytania ... ale myślę, że -2 to za dużo dla tego pytania. –
- 1. Używanie klasy wewnętrznej BatteryStatsImpl przez odbicie w Androidzie
- 2. Kpiny z klasy, która dziedziczy z innej klasy
- 3. testowanie klasy wewnętrznej
- 4. Serializacja statycznej klasy wewnętrznej
- 5. Sesja hibernacji wewnątrz klasy wewnętrznej
- 6. Dodaj klasy dynamicznie do dzieci przez zapętlenie przez div
- 7. Ustaw właściwość Nullable <> przez odbicie
- 8. Jak odnieść się do chronionej klasy wewnętrznej w Scali, gdy dziedziczy z Javy (tylko z kodem bajtu)
- 9. Błąd pompowania widoku klasy wewnętrznej
- 10. Pobierz obiekt klasy zewnętrznej z obiektu klasy wewnętrznej.
- 11. Dostęp do klasy zewnętrznej "super" z klasy wewnętrznej w Javie
- 12. Zwróć wskaźnik do zagnieżdżonej klasy wewnętrznej z ogólnej klasy zewnętrznej
- 13. Dziedziczy z klasy, która ma konstruktora kopii usunięty
- 14. Python klasa dziedziczy wieloprocesorowe, kłopoty z dostępem do członków klasy
- 15. Używanie Java klasy wewnętrznej i tworzenie instancji
- 16. Java: statyczne zagnieżdżone klasy i odbicie: "$" vs "."
- 17. Dodawanie nowej metody do klasy poprzez odbicie
- 18. Dynamicznie generuj klasy referencyjne
- 19. Metoda wewnętrzna: definicja klasy wewnętrznej i zewnętrznej
- 20. Najlepszy sposób wywoływania gettera przez odbicie
- 21. Jak znaleźć metodę przeciążenia przez odbicie
- 22. Nie można zaimportować statycznej klasy wewnętrznej statycznej?
- 23. Niedokonana definicja funkcji wyspecjalizowanego szablonu klasy wewnętrznej?
- 24. Java vs Groovy wewnętrznej/zewnętrznej klasy rozbieżności
- 25. scala: porównaj typy obiektów klasy wewnętrznej
- 26. Jak stworzyć wiosenną fasolę klasy wewnętrznej?
- 27. Tworzenie klasy dynamicznie
- 28. Poprawna składnia dla iteratora odwzorowania klasy wewnętrznej klasy szablonu?
- 29. Jak znaleźć wszystkie bezpośrednie podklasy klasy z .NET Odbicie
- 30. java dostęp Integer konstruktor przez odbicie
to niemożliwe. –
Może jakieś tło co do tego, co próbujesz osiągnąć i dlaczego pomoże ci uzyskać użyteczną odpowiedź. –
Nie rozumiem, dlaczego to pytanie zostało zamknięte jako "nie jest to prawdziwe pytanie". Myślę, że jasne jest, co OP chciał zapytać. Przyznaję, że jest to naprawdę "perwersyjne" (jak pisał JanHanna w jego odpowiedzi), ale tak naprawdę mam problem (klasa, która wcześniej była publiczna, została wykonana wewnętrznie z jednej wersji do drugiej z naszego systemu). że możemy "rozwiązać", dziedzicząc z klasy wewnętrznej, jeśli to możliwe ... – pholpar