2011-07-15 13 views
10

¿Puedo definir una clase que se deriva de DynamicObject y admite una interfaz (ICanDoManyThings) sin tener que implementar cada método en la interfaz?¿Hay alguna manera de crear un DynamicObject que admita una interfaz?

Estoy tratando de hacer un objeto proxy dinámico, y quiero que las invocaciones de métodos en esta clase sean manejadas por la implementación de MyProxyClass.TryInvokeMember, que puede o no pasarlas a un objeto envuelto.

¿Esto es posible?

Gracias

Respuesta

7

ImpromptuInterface hace exactamente esto y funciona con CUALQUIER IDynamicMetaObjectProvider incluidas las subclases DynamicObject y ExpandoObject.

using ImpromptuInterface; 
using ImpromptuInterface.Dynamic; 

public interface IMyInterface{ 

    string Prop1 { get; } 

    long Prop2 { get; } 

    Guid Prop3 { get; } 

    bool Meth1(int x); 
} 

...

//Dynamic Expando object 
dynamic tNew = Build<ExpandoObject>.NewObject(
     Prop1: "Test", 
     Prop2: 42L, 
     Prop3: Guid.NewGuid(), 
     Meth1: Return<bool>.Arguments<int>(it => it > 5) 
); 

IMyInterface tActsLike = Impromptu.ActLike<IMyInterface>(tNew); 

Linfu realidad no va a usar objetos basados ​​DLR y en cambio utiliza su propio ingenuo el enlace en tiempo que le da un costo de rendimiento GRAVES. Clay usa el dlr pero tienes que quedarte con los objetos de Clay que están diseñados para que inyectes todo el comportamiento en un ClayObject que no siempre es sencillo.

+0

¿Funciona esto si escribo mi propio expando y llamo 'ActLike'? Me gusta, 'dynamic tNew = new ExpandoObject(); tNew.Prop1 = "Test"; '... etc ... y' Impromptu.ActLike (tNew); '? – nawfal

+1

Sí, funciona con cualquier 'IDynamicMetaObjectProvider', ya que utiliza las api de la palabra clave' dynamic 'de C#. – jbtule

3

Con Clay, se puede.

Un ejemplo:

public interface IMyInterface 
{ 
    string Prop1 { get; } 

    long Prop2 { get; } 

    Guid Prop3 { get; } 

    Func<int, bool> Meth { get; } 
} 

//usage: 

dynamic factory = new ClayFactory(); 
var iDynamic = factory.MyInterface 
(
    Prop1: "Test", 
    Prop2: 42L, 
    Prop3: Guid.NewGuid(), 
    Meth: new Func<int, bool>(i => i > 5) 
); 

IMyInterface iStatic = iDynamic; 

This article muestra cuantas maneras de lograr esto.

+0

Es mejor instalar ClaySharp de nuget en lugar de Clay ya que este último tiene una dependencia con el proyecto Castle.Core (desafortunadamente no funciona con el último Castle.Core) mientras que el primero no tiene problemas de dependencia. – nawfal

+0

Si bien Clay ofrece una gran flexibilidad, me gusta el enfoque de Impromptu. Muy claro. En otro caso, Clay no juega bien con las interfaces que tienen métodos. – nawfal

Cuestiones relacionadas