2011-12-13 20 views
5

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

+2

to niemożliwe. –

+4

Może jakieś tło co do tego, co próbujesz osiągnąć i dlaczego pomoże ci uzyskać użyteczną odpowiedź. –

+0

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

Odpowiedz

18

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(); 
     } 
    } 
} 
1

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.

+1

Możesz uzyskać dostęp do wewnętrznych typów poprzez odbicie. –

+0

@YuriyFaktorovich Możesz uzyskać do nich dostęp, ale o ile wiem, nie możesz ich odziedziczyć. – aevitas

+0

Zgaduję, że możesz używać ILGeneratora, ale jeszcze go nie wypróbowałeś. –

5

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.

+0

+1 dla wartości entertainmet. Ale nie można nawiązać przyjaźni poprzez refleksję, więc nie jest to zbyt przydatne dla EOG. –

+0

Interpretuję "ex." jako "na przykład", więc refleksja może nie być trudnym wymogiem. – surfen

+0

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. –

Powiązane problemy