Ho bisogno di generare una nuova interfaccia in fase di esecuzione con tutti gli stessi membri di un'interfaccia esistente, tranne che inserirò attributi diversi su alcuni dei metodi (alcuni di i parametri degli attributi non sono noti fino al momento dell'esecuzione). Come può essere raggiunto?Utilizzo di Reflection.Emit di .NET per generare un'interfaccia
7
A
risposta
8
La tua domanda non è molto specifica. Se lo aggiorni con più informazioni, affiderò questa risposta con ulteriori dettagli.
Ecco una panoramica dei passaggi manuali coinvolti.
- Creare un assieme con DefineDynamicAssembly
- Creare un modulo con DefineDynamicModule
- Create tipo con DefineType. Assicurati di passare
TypeAttributes.Interface
per rendere il tuo tipo un'interfaccia. - Iterare sui membri nell'interfaccia originale e creare metodi simili nella nuova interfaccia, applicando gli attributi in base alle esigenze.
- Chiama
TypeBuilder.CreateType
per completare la creazione dell'interfaccia.
12
per creare dinamicamente un assieme con un'interfaccia che ha attributi:
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);
che crea la seguente:
namespace Hello.World
{
[Fun("Hello")]
public interface IFoo
{}
}
metodi Aggiunta utilizzano la classe MethodBuilder chiamando TypeBuilder.DefineMethod.
Problemi correlati
- 1. Framework per .net Reflection.Emit semplificazione?
- 2. Utilizzo di Reflection.Emit per creare una classe che implementa un'interfaccia
- 3. Equivalente Java di Reflection.Emit
- 4. Utilizzo di LINQ per generare numeri primi
- 5. Reflection.Emit vs CodeDOM
- 6. Alternative a Reflection.Emit per Compact Framework
- 7. Utilizzo del tipo emesso come parametro tipo in Reflection.Emit
- 8. Utilizzo di C# per generare dinamicamente file CSS
- 9. Utilizzo di MsBuild per generare manifest MsDeploy personalizzato (destinazione pacchetto)
- 10. Utilizzo di Wordnet per generare superlativi, comparativi e aggettivi
- 11. Utilizzo di Javadocs per generare il documento Swagger
- 12. Utilizzo di PHP per generare schermate da una sorgente HTML
- 13. Utilizzo di una DSL per generare codice C#
- 14. Utilizzo dell'array per generare testo casuale
- 15. Reflection.Emit migliore di GetValue e SetValue: S
- 16. Utilizzo di System.Threading.Tasks.Parallel con subset portatile .NET
- 17. Utilizzo di Thrift per connettersi a Cassandra da .NET
- 18. Utilizzo di .Net Parallel Extensions (Parallel.Invoke) per più chiamate asincrone?
- 19. Utilizzo di delegati anonimi con .NET ThreadPool.QueueUserWorkItem
- 20. Utilizzo di singleton in .Net Remoting
- 21. Utilizzo di CSharpCodeProvider con .net 4.5 beta
- 22. Implementazione esplicita dell'interfaccia e Reflection.Emit
- 23. Utilizzo di .NET Core sull'applicazione desktop
- 24. Utilizzo di ApacheFOP v1.0 nell'applicazione .NET
- 25. Utilizzo di WiX per generare un programma di installazione per un sito Web ASP.Net MVC
- 26. come generare l'url di sillabazione in MVC 4 .net
- 27. Utilizzo di System.Random
- 28. .NET generare metodo generico - compact framework
- 29. Utilizzo delle rotte per generare URL in un'attività Symfony
- 30. Utilizzo di MD5 per generare una chiave di crittografia dalla password?
Nah, è fantastico. Non avevo bisogno di usare Reflection.Emit prima, quindi volevo solo vedere se qualcuno poteva individuare un ostacolo nel mio piano malvagio. –