2011-08-21 12 views
5

Sto lavorando su qualcosa che deve prendere un contratto (specificato come interfaccia) e creare un'istanza al volo, senza alcuna classe concreta formalmente definita che soddisfi questa interfaccia.Libreria Open Source per la generazione di tipi di calcestruzzo dalle interfacce durante il runtime?

Un esempio di sintassi è simile a questo:

IExampleMessage message = MessageBuilder.Create<IExampleMessage>(x => { 
    x.PropertyA = "Test"; 
    x.PropertyB = 5; 
}); 

Ho visto altre librerie .NET framework e offrono un comportamento come questo (NServiceBus viene in mente), e mi chiedo se c'è un Libreria di terze parti che allontana il codice di runtime gen. Pensavo che Castle DynamicProxy sarebbe stato un posto dove guardare, ma questo sembra concentrato interamente sul proxy e sull'intercettazione, e non sembra esporre l'aspetto della generazione del codice.

Potrei scrivere un'implementazione che utilizza Reflection.Emit per creare la classe al volo, tuttavia preferirei usare una solida libreria open source se ne esiste una.

Qualche suggerimento?

+0

Sono curioso: come sarebbero supportate le interfacce con i metodi? Come intendi specificare un'implementazione personalizzata di un metodo con quella sintassi? –

+0

Le interfacce con i metodi non sono supportate –

+0

Ho visto codice simile in BLTookit – adontz

risposta

1

E le librerie di mocking - NMock e RhinoMocks?

È possibile aggiungere implementazioni ai tipi di calcestruzzo utilizzando anche tronchetti/aspettative.

In particolare, Rhino ha una sintassi basata su lambda per il tipo di cosa che si desidera.

Non soddisfa pienamente le vostre esigenze?

Qualcosa di simile?

IExampleMessage message = MockRepository.GenerateStub<IExampleMessage>(); 
message .Stub(x => x.PropertyA).Return("Text")  
message .Stub(x => x.PropertyB).Return(5) 
2

interfaccia Impromptu è quello che vi serve: - http://code.google.com/p/impromptu-interface/

ho usato per creare polymorphic types in .NET.

Si potrebbe anche guardare Clay.

+0

Stavo cercando di stare lontano da Dynamic. Comunque quella roba è abbastanza bella. –

+1

@ Jonathan-Holland nel caso d'uso che stai descrivendo non ti richiederebbe di vedere effettivamente l'uso di dinamiche nel tuo codice quando usi estemporaneo (anche se avverrà dietro le quinte). Esempio di implementazione: 'public T Create (azione init) dove T: class {var message = new ExpandoObject(). ActLike (); init (messaggio); return message;} ' – jbtule

Problemi correlati