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.
Questions connexes
- 1. Utilisation de Visio pour générer MySQL DDL
- 2. Générer une interface utilisateur CRUD par défaut lors de l'utilisation de Castle ActiveRecord (.net)
- 3. Interface utilisateur pour générer des fichiers de construction Phing?
- 4. Utilisation de sed pour générer dynamiquement un nom de fichier
- 5. .Net User Interface de contrôle
- 6. Utilisation de JavaScript/jQuery pour générer des appareils
- 7. Utilisation de NHibernate avec Codesmith pour générer ORM
- 8. Étrange séquence de paramètres utilisant Reflection.Emit
- 9. Interface WebCam standard pour .NET en plus de DirectShow?
- 10. Interface utilisateur pour multiplateforme .net Application
- 11. Interface utilisateur pour une application de bureau
- 12. Groovy: Délégation de métaclasse pour une interface?
- 13. Utilisation des balises Interface Builder
- 14. Est-il possible de générer dynamiquement une classe dans .NET?
- 15. Utilisation de la bibliothèque SharpMap pour générer une superposition Google Maps
- 16. Utilisation de différentes langues .Net?
- 17. Utilisation de la mémoire + .net
- 18. Utilisation de ScrollBars dans .Net
- 19. Est-il possible d'implémenter une interface COM avec une classe de génériques .NET?
- 20. Interface COM IRAPIStream dans .NET
- 21. Utilisation de CoGetClassObject() en C - interface COM Object Access
- 22. Utilisation de variables d'environnement pour le fichier .config dans .NET
- 23. Comment puis-je générer de la documentation HTML pour une classe SOAP/WebService dans .Net?
- 24. Utilisation de Runnable Interface dans le programme Applet?
- 25. Générer une interface à partir d'un fichier de classe solide dans Eclipse
- 26. Utilisation des définitions de type de document XML dans .net
- 27. Utilisation de 2 noms d'hôte pour la même application .NET
- 28. Reflection.Emit Generic Base Class Méthode générique Appelez
- 29. Utilisation de Regex pour générer des chaînes plutôt que de les faire correspondre
- 30. Utilisation de foreach pour créer une grille
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. –