2008-09-25 15 views
7

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

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.

  1. Crear un conjunto con DefineDynamicAssembly
  2. Crear un módulo con DefineDynamicModule
  3. Crear el tipo con DefineType. Asegúrese de pasar TypeAttributes.Interface para hacer que su tipo sea una interfaz.
  4. 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.
  5. TypeBuilder.CreateType llamada para terminar la construcción de su interfaz.
+0

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

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