¿Hay alguna forma de de heredar de una clase abstracta interna en una clase de tiempo de ejecución generada dinámicamente (como por reflexión) con .NET Framework 4.0?Heredar dinámicamente de la clase interna a través de la reflexión
Respuesta
Fuera de un sentido general de perversidad frente a cosas que no deberían ser posibles, lo intenté a ver cómo Me gustaría tratar de crear una clase heredada de System.CurrentSystemTimeZone
(una clase interna en mscorlib). Te permite llegar a crear un TypeBuilder
, pero cuando llamas al CreateType
arroja un TypeLoadException
con el mensaje "Acceso denegado: 'System.CurrentSystemTimeZone'."
Un poco más de violín me llevó a la conclusión de que se podía crear un ensamblaje de forma dinámica que tenía el nombre fuerte que lo identificaba como un ensamblaje amigo del ensamblaje en el que se define el tipo interno. Pero entonces, en ese caso, podría simplemente codificar class Foo : CurrentSystemTimeZone
de todos modos, sin ningún engaño.
De todos modos, el código por lo que la línea que lanza está por debajo, por si alguien está en el estado de ánimo para intentar alguna variante aún más perversa en la idea, y quiere un punto de partida:
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();
}
}
}
No puede. Puede usar tipos que no son públicos usando Assembly.GetType()
, pero no puede heredar de ellos. Jon Skeet explains in this article por qué generalmente es una mala idea acceder a miembros no públicos, y responde su pregunta más en profundidad que yo.
Puede acceder a los tipos internos a través de Reflection. –
@YuriyFaktorovich Puede acceder a ellos, pero hasta donde yo sé, no puede heredar de ellos. – aevitas
En realidad estoy adivinando que puede usar el ILGenerator, pero aún no lo he probado. –
Claro que puede y no necesita reflexión para eso. La clase heredada solo necesita estar en el mismo ensamblaje :)
También puede configurar amistad entre conjuntos: http://msdn.microsoft.com/en-us/library/0tke9fxk%28v=VS.100%29.aspx, que permitiría el acceso a las clases internas de un ensamblaje. Este enfoque a veces es útil para crear ensamblajes de Prueba de unidad que necesitan acceso interno a conjuntos probados
+1 para el valor de entretenimiento. Pero uno no puede hacer amistad a través de la reflexión, por lo que no es realmente útil para EOG. –
Interpreto "ex" como "por ejemplo", por lo que la reflexión puede no ser un requisito difícil. – surfen
Buen punto ... Supongo que @EOG debería obtener -1 para el título que no coincide con la pregunta ... pero creo que -2 es demasiado para esta pregunta. –
- 1. ¿Cómo puedo obtener una clase interna para heredar el tipo genérico de la clase adjunta?
- 2. ¿Cómo acceder a la clase Java interna estática a través de la interoperabilidad Clojure?
- 3. Uso de la clase interna BatteryStatsImpl a través de Reflection en android
- 4. ¿Es posible agregar comportamiento a una clase de ActionScript 3 no dinámica sin heredar la clase?
- 5. La subclasificación clase interna de la clase externa versus otra clase interna
- 6. sin ánimo de final de la clase de Java a través de API de reflexión
- 7. Heredar variable estática de la clase abstracta
- 8. ¿Cómo se puede heredar de una clase sellada usando la reflexión en .Net?
- 9. .NET propiedad privada a través de la reflexión
- 10. Obtener valor de enumeración a través de la reflexión
- 11. Uso de C# con OpenOffice a través de la reflexión
- 12. evento Pass de la clase C a través de la clase B a la clase A
- 13. clase Anotar con clase interna
- 14. Obteniendo una lista de métodos accesibles para una clase dada a través de la reflexión
- 15. Cambiar campos final privado a través de la reflexión
- 16. ¿Es posible establecer propiedad privada a través de la reflexión?
- 17. C#: Obtener valor a través de la reflexión
- 18. Obtener MethodBase actual a través de la reflexión
- 19. Invocando métodos con parámetros opcionales a través de la reflexión
- 20. Clase interna que accede a la clase externa
- 21. Crear instancias de un constructor con parámetros en una clase interna con la reflexión
- 22. clase interna dentro de la interfaz
- 23. Agregue css dinámicamente a la página a través de javascript
- 24. Creando una instancia de la clase interna
- 25. Obtener nombre de la cadena de establecimiento a través de la reflexión
- 26. Acceder al valor de la variable final estática de Java a través de la reflexión
- 27. No se puede acceder a la clase interna en bean
- 28. Obtener métodos de clase utilizando la reflexión
- 29. acceso a los datos privados de los miembros de la clase externa en la clase interna
- 30. cómo acceder a una variable de clase de la clase externa de clase interna en rubí
Eso es imposible. –
Tal vez algunos antecedentes sobre lo que está tratando de lograr y por qué ayudaría a obtener una respuesta útil. –
No veo por qué esta pregunta se cerró como "no es una pregunta real". Creo que está claro lo que el OP quería preguntar. Admito que es realmente bastante "perverso" (como escribió John Hanna en su respuesta), pero en realidad tengo un problema (una clase que previamente era pública, se hizo interna de una versión a otra del marco en el que dependemos), que podemos "resolver" heredando de una clase interna, si es posible ... – pholpar