Utiliser Reflection.Emit de .NET pour générer une interface
-
02-07-2019 - |
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é?
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.
- Créer un assemblage avec DefineDynamicAssembly
- Créer un module avec DefineDynamicModule
- Créez le type avec DefineType. Assurez-vous de passer
TypeAttributes.Interface
pour que votre type devienne une interface. - 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.
- 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.