que necesito para generar una nueva interfaz en tiempo de ejecución con todos los mismos miembros que una interfaz existente, excepto que voy a estar poniendo diferentes atributos en algunos de los métodos (algunos de los parámetros de atributo no se conocen hasta el tiempo de ejecución). ¿Cómo puede lograrse?Reflection.Emit de .NET para generar una interfaz
7
A
Respuesta
8
Su pregunta no es muy específica. Si lo actualiza con más información, desarrollaré esta respuesta con más detalles.
He aquí un resumen de los pasos manuales implicadas.
- Crear un conjunto con DefineDynamicAssembly
- Crear un módulo con DefineDynamicModule
- Crear el tipo con DefineType. Asegúrese de pasar
TypeAttributes.Interface
para hacer que su tipo sea una interfaz. - iterar sobre los miembros en la interfaz original y construir métodos similares en la nueva interfaz, la aplicación de atributos según sea necesario.
TypeBuilder.CreateType
llamada para terminar la construcción de su interfaz.
12
para crear dinámicamente un conjunto con una interfaz que tiene atributos:
using System.Reflection;
using System.Reflection.Emit;
// Need the output the assembly to a specific directory
string outputdir = "F:\\tmp\\";
string fname = "Hello.World.dll";
// Define the assembly name
AssemblyName bAssemblyName = new AssemblyName();
bAssemblyName.Name = "Hello.World";
bAssemblyName.Version = new system.Version(1,2,3,4);
// Define the new assembly and module
AssemblyBuilder bAssembly = System.AppDomain.CurrentDomain.DefineDynamicAssembly(bAssemblyName, AssemblyBuilderAccess.Save, outputdir);
ModuleBuilder bModule = bAssembly.DefineDynamicModule(fname, true);
TypeBuilder tInterface = bModule.DefineType("IFoo", TypeAttributes.Interface | TypeAttributes.Public);
ConstructorInfo con = typeof(FunAttribute).GetConstructor(new Type[] { typeof(string) });
CustomAttributeBuilder cab = new CustomAttributeBuilder(con, new object[] { "Hello" });
tInterface.SetCustomAttribute(cab);
Type tInt = tInterface.CreateType();
bAssembly.Save(fname);
Eso crea la siguiente:
namespace Hello.World
{
[Fun("Hello")]
public interface IFoo
{}
}
métodos Adición utilizan la clase MethodBuilder llamando TypeBuilder.DefineMethod.
Cuestiones relacionadas
- 1. Marco para .net Reflection.Emit simplification?
- 2. Reflection.Emit para crear una clase que implementa una interfaz
- 3. Implementación de interfaz explícita y Reflection.Emit
- 4. Cómo emitir implementación de interfaz explícita usando Reflection.Emit?
- 5. Cómo generar una clase desde una interfaz
- 6. Reflection.Emit vs CodeDOM
- 7. Alternativas a Reflection.Emit para Compact Framework
- 8. ¿Cómo generar una interfaz multiplataforma con SWIG?
- 9. Generar interfaz de clase existente
- 10. Equivalente de Java de Reflection.Emit
- 11. Usando xsd para generar XML en .net
- 12. Usando Reflection.Emit para emitir un bloque "using (x) {...}"?
- 13. ¿Generar automáticamente una implementación de interfaz en C#?
- 14. ¿Cómo implementa .Net CLR una "Interfaz" internamente?
- 15. ¿Cómo se puede inyectar una expresión literal usando Reflection.Emit?
- 16. Cómo usar swig para generar una interfaz php para C++ así que
- 17. Creación automática de un contenedor para implementar una interfaz
- 18. ¿Existe alguna herramienta o marco para generar una interfaz de usuario CRUD en Swing?
- 19. Herencia/jerarquías de interfaz en .Net: ¿hay una forma mejor?
- 20. Implementación dinámica de una interfaz en .NET 4.0 (C#)
- 21. Reflection.Emit: accede al elemento más al máximo de la pila
- 22. Diagnóstico de .NET OutOfMemoryException al generar informes
- 23. ¿Puede Eclipse generar automáticamente una interfaz de una clase de biblioteca de terceros?
- 24. Reflection.Emit better than GetValue & SetValue: S
- 25. ¿Biblioteca de código abierto para generar tipos concretos de interfaces durante el tiempo de ejecución?
- 26. Objetivo común personalizado para generar una solución
- 27. Herramienta de usuario final para generar una expresión regular
- 28. Creando una clase para una interfaz en tiempo de ejecución, en C#
- 29. Cómo detener .Net HttpWebRequest.GetResponse() al generar una excepción
- 30. ¿Existe una biblioteca de pruebas unitarias predeterminadas para implementaciones de interfaz .NET?
No, eso está bien. No necesitaba usar Reflection.Emit antes, así que solo quería ver si alguien podía detectar un obstáculo en mi malvado plan maestro. –