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 vais mettre des attributs différents sur certaines des méthodes (certaines de les paramètres d'attribut ne sont pas connus avant l'exécution). Comment peut-on y arriver?Utilisation de Reflection.Emit de .NET pour générer une interface
7
A
Répondre
8
Votre question n'est pas très précise. Si vous mettez à jour avec plus d'informations, je vais étoffer cette réponse avec des détails supplémentaires.
Voici un aperçu des étapes manuelles impliquées.
- Créer un assemblage avec DefineDynamicAssembly
- Créer un module avec DefineDynamicModule
- créer le type de DefineType. Assurez-vous de passer le
TypeAttributes.Interface
pour que votre type devienne une interface. - Effectuez une itération sur les membres dans l'interface d'origine et construisez des méthodes similaires dans la nouvelle interface, en appliquant les attributs si nécessaire.
- Appelez
TypeBuilder.CreateType
pour terminer la construction de votre interface.
12
Pour créer dynamiquement un assemblage avec une interface qui a 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
{}
}
méthodes Ajout d'utiliser la classe MethodBuilder en appelant TypeBuilder.DefineMethod.
Nah, c'est cool. Je n'ai pas eu besoin d'utiliser Reflection.Emit auparavant, je voulais juste voir si quelqu'un pouvait repérer une pierre d'achoppement dans mon plan directeur diabolique. –