Question

Je dois générer une nouvelle interface au moment de l'exécution avec les mêmes membres qu'une interface existante, sauf que je mettrai des attributs différents sur certaines méthodes (certains paramètres d'attribut ne sont pas connus avant l'exécution ). Comment cela peut-il être réalisé?

Était-ce utile?

La solution

Votre question n’est pas très précise. Si vous le mettez à jour avec plus d'informations, je vais préciser cette réponse avec des détails supplémentaires.

Voici un aperçu des étapes manuelles nécessaires.

  1. Créer un assemblage avec DefineDynamicAssembly
  2. Créer un module avec DefineDynamicModule
  3. Créez le type avec DefineType. Assurez-vous de passer TypeAttributes.Interface pour que votre type devienne une interface.
  4. Parcourez les membres de l'interface d'origine et créez des méthodes similaires dans la nouvelle interface, en appliquant les attributs nécessaires.
  5. Appelez TypeBuilder.CreateType pour terminer la construction de votre interface.

Autres conseils

Pour créer dynamiquement un assemblage avec une interface ayant des attributs:

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);

Cela crée les éléments suivants:

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

L'ajout de méthodes utilise la classe MethodBuilder en appelant TypeBuilder.DefineMethod.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top