c# - puede - que es una interfaz en programacion
Implementación dinámica de una interfaz en.NET 4.0(C#) (5)
Complementando la respuesta de @jbtule, he creado mi CustomActivator que es capaz de crear un objeto dinámico en tiempo de ejecución y hacer que implemente la interfaz deseada. También uso el Impromptu-Interface para lograr eso.
La llamada es simple:
CustomActivator.CreateInstance<MyInterface>();
Lo puse en github .
Con las nuevas capacidades dinámicas en .NET 4.0, parece que debería ser posible implementar dinámicamente una interfaz, por ejemplo dado:
public interface IFoo
{
string Bar(int baz);
}
public class Foo : IFoo
{
public string Bar(int baz) { return baz.ToString(); }
}
public class Proxy : IDynamicMetaObjectProvider
{
private readonly object target;
public Proxy(object target) { this.target = target; }
// something clever goes here
}
Entonces espero que haya alguna forma de hacer posible escribir:
dynamic proxy = new Proxy(new Foo());
IFoo fooProxy = (IFoo)proxy; // because the target object implements it
string bar = fooProxy.Bar(123); // delegates through to the target implementation
Pero, hasta ahora, no estoy seguro de qué reemplazar // something clever goes here
con esto.
Entonces, mis preguntas son:
¿Es esto realmente posible con el tiempo de ejecución dinámico? Parece que la implementación dinámica de cosas como métodos y propiedades es bastante fácil, pero no he encontrado ninguna documentación sobre la implementación dinámica de interfaces y conversiones.
Suponiendo que esto sea posible, ¿qué tan difícil será? (Puede suponer que soy un programador decente con mucha experiencia en cosas como la reflexión, pero nuevo en el marco dinámico).
¿Hay algún recurso que me ayude a orientarme en la dirección correcta para implementar algo como esto? ¿O incluso muestras donde ya se ha hecho este tipo de cosas que puedo usar como punto de partida?
Creo que escribí una biblioteca que hace lo que quiere ... Se llama DynamicWrapper (en CodePlex) y automáticamente ajustará una clase para que implemente una interfaz. ¿Es esto lo que quieres?
El framework opensource Impromptu-Interface fue diseñado para hacer esto. Genera un proxy liviano en caché con una interfaz estática y utiliza el dlr para reenviar la invocación al objeto original.
using ImpromptuInterface;
public interface ISimpeleClassProps
{
string Prop1 { get; }
long Prop2 { get; }
Guid Prop3 { get; }
}
-
dynamic tOriginal= new ExpandoObject();
tOriginal.Prop1 = "Test";
tOriginal.Prop2 = 42L;
tOriginal.Prop3 = Guid.NewGuid();
ISimpeleClassProps tActsLike = Impromptu.ActLike(tOriginal);
Hasta donde yo sé, no es posible sin intervención manual escribir o generar código que reenvía los miembros de la interfaz a la instancia envuelta. Si desea ver el soporte provisto por Microsoft para este tipo de cosas, puede considerar votar en https://connect.microsoft.com/VisualStudio/feedback/details/526307/add-automatic-generation-of-interface-implementation-via-implementing-member .
La conversión explícita, as
y falla debido a la comparación de tipos sería en contra de su clase base proxy, pero la conversión implícita puede desencadenar DynamicObject.TryConvert, de modo que puede devolver el objeto interno en lugar del objeto dinámico.
- Documentación de TryConvert MSDN
Si bien el código siguiente funciona, esto no es delegación de interfaz per se, solo la exposición del estado interno. Parece que podría estar buscando algo así como un patrón de intercepción como Brian''s DynamicWrapper.
dynamic wrapper = new Proxy(new Foo());
IFoo foo = wrapper;
foo.Bar();
class Proxy : DynamicObject
{
...
public override bool TryConvert(ConvertBinder binder, out object result)
{
Type bindingType = binder.Type;
if (bindingType.IsInstanceOfType(target))
{
result = target;
return true;
}
result = null;
return false;
}
}