Sto cercando di prendere una serie di oggetti, diciamo che ci sono 3 oggetti vivi al momento, che implementano un'interfaccia comune, e poi avvolgono quegli oggetti all'interno di una quarta oggetto, implementando anche la stessa interfaccia.Creazione di una classe per un'interfaccia in fase di esecuzione, in C#
Le implementazioni di metodi e proprietà del quarto oggetto chiamerebbero semplicemente i bit rilevanti su questi 3 oggetti sottostanti. So che qui ci saranno casi in cui non avrà senso farlo, ma questo è per un'architettura multicast di servizi, quindi c'è già un buon set di limitazioni.
La mia domanda è da dove cominciare. La generazione di quel quarto oggetto dovrebbe essere fatta in memoria, in fase di esecuzione, quindi sto pensando a Reflection.Emit
, sfortunatamente non ho abbastanza esperienza per sapere da dove cominciare.
Devo costruire un assieme in memoria? Di certo sembra così, ma vorrei solo un rapido puntatore a dove dovrei iniziare.
Fondamentalmente sto considerando un'interfaccia e un elenco di istanze di oggetti che implementano quell'interfaccia e che costruiscono un nuovo oggetto, implementando anche quell'interfaccia, che dovrebbe "multicastare" tutte le chiamate di metodo e l'accesso a tutte le proprietà oggetti sottostanti, almeno il più possibile. Ci saranno un mucchio di problemi con eccezioni e simili, ma affronterò quei bit quando li raggiungerò.
Questo è per un'architettura orientata ai servizi, in cui mi piacerebbe avere il codice esistente che prende, ad esempio, un servizio di logger, per accedere ora a più servizi di logger, senza dover cambiare il codice che utilizza i servizi . Invece, mi piacerebbe runtime-generare un logger-service-wrapper che internamente chiama semplicemente i metodi rilevanti su più oggetti sottostanti.
Questo è per .NET 3.5 e C#.
realtà ho scritto un esempio che ha fatto questo (qui su SO) qualche mese fa ... Vedrò se riesco a trovarlo ... –
Come così? http://stackoverflow.com/questions/847809/how-can-i-write-a-generic-container-class-that-implements-a-given-interface-in-c/847975#847975 –
Marc, scegli un per risolvere questo problema, contrassegna la domanda come duplicata o posta una risposta reale che posso accettare. –