2011-08-21 15 views
5

Estoy trabajando en algo que necesita tomar en un contrato (especificado como una interfaz) y crear una instancia sobre la marcha, sin una clase concreta formalmente definida que cumpla con esta interfaz.¿Biblioteca de código abierto para generar tipos concretos de interfaces durante el tiempo de ejecución?

Un ejemplo de la sintaxis es la siguiente:

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

que he visto otras bibliotecas y frameworks .NET ofrecen un comportamiento como éste (NServiceBus viene a la mente), y me pregunto si hay una Biblioteca de terceros que abstrae el gen de código de tiempo de ejecución. Pensé que Castle DynamicProxy sería un lugar para buscar, pero esto parece centrarse por completo en el proxy y la interceptación, y no parece exponer el aspecto de generación de código.

Podría escribir una implementación que utiliza Reflection.Emit para crear la clase sobre la marcha, sin embargo, prefiero usar una biblioteca de código abierto sólida, si existe.

¿Alguna sugerencia?

+0

Tengo curiosidad: ¿cómo se soportarían las interfaces con los métodos? ¿Cómo piensa especificar una implementación personalizada de un método con esa sintaxis? –

+0

No se admiten interfaces con métodos –

+0

Vi código similar en BLTookit – adontz

Respuesta

1

¿Qué pasa con las bibliotecas de burla - NMock y RhinoMocks?

Puede agregar implementaciones a los tipos de concreto utilizando stubs/expectativas también.

Rhino, en particular, tiene una buena sintaxis basada en lambda para el tipo de cosa que desee.

¿Esto no llena por completo sus necesidades?

¿Algo como esto?

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

interfaz de Impromptu es lo que necesita: - http://code.google.com/p/impromptu-interface/

Lo he utilizado para crear polymorphic types in .NET.

También puede consultar Clay.

+0

Estaba intentando mantenerme alejado de Dynamic. Sin embargo, esas cosas son geniales. –

+1

@ Jonathan-Holland en el caso de uso que está describiendo no requeriría que vea realmente ningún uso de dinámica en su código cuando usa improvisado (aunque sucederá detrás de escena). Implementación de ejemplo: 'public T Create (Acción init) donde T: clase {var message = new ExpandoObject(). ActLike (); init (mensaje); devolver mensaje;} ' – jbtule

Cuestiones relacionadas