Pergunta

Eu preciso gerar uma nova interface em tempo de execução com todos os mesmos membros como uma interface existente, exceto que eu estarei colocando atributos diferentes em alguns dos métodos (alguns dos parâmetros de atributos não são conhecidos até run-time ). Como ela pode ser alcançada?

Foi útil?

Solução

A sua pergunta não é muito específico. Se você atualizá-lo com mais informações, eu vou detalhar esta resposta com detalhes adicionais.

Aqui está uma visão geral das etapas manuais envolvidas.

  1. Criar uma montagem com DefineDynamicAssembly
  2. Criar um módulo com DefineDynamicModule
  3. Criar o tipo com DefineType. Certifique-se de passar TypeAttributes.Interface para fazer o seu tipo de uma interface.
  4. iterar sobre os membros na interface e construir métodos semelhantes originais na nova interface, aplicando atributos conforme necessário.
  5. Chamada TypeBuilder.CreateType para terminar de construir sua interface.

Outras dicas

Para criar dinamicamente uma montagem com uma interface que tem 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);

Isso cria o seguinte:

namespace Hello.World
{
   [Fun("Hello")]
   public interface IFoo
   {}
}

métodos Adicionando usar a classe MethodBuilder chamando TypeBuilder.DefineMethod.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top