Pregunta

Los métodos de extensión C # 3.0 agregan extensiones al Tipo base, haciendo que llamar a ese método en todas las instancias de ese Tipo sea legal.

Ahora, JavaScript que conozco implementa IDispatchEx a través del cual es posible agregar métodos a una instancia específica.

Entonces, ¿cómo agrego un conjunto de métodos a una 'instancia' de una clase C #? Sé que este es un territorio de guerra santa de Lenguajes dinámicos vs. Estáticos. :) Permítanme aclarar que mi intención NO es eso.

Solo quiero poder agregar un conjunto de eventos a una interfaz dependiendo de la clase que implemente esa interfaz.

Pude hacerlo usando Generics

inteface ISample<T> { T SupportedEvents; }  

class Sample : ISample<UIWidgetEvent>   {   }  
class Sample2 : ISample<NonVisualUIWidget> { }

class UIWidgetEvent { public EventHandler Clicked; }  
class NonVisualUIWidget {public EventHandler Expired;}

class TestSample
{  
    public void Test()
    {  
        new Sample().SupportedEvents.Clicked += ...
        new Sample2().SupportedEvents.Expired += ...
    }  
}  

Entonces no me gustó SupportedEvents quiero poder decir

new Sample().Clicked +=...

Entonces pensé que JavaScript (sé que C # no es JS :)) ... Y IDispatchEx , IL Weaving , Reflection.Emit etc. etc. y se piensa que hay una manera de hacer esto ... [El soporte de tiempo de diseño sería bueno pero puedo vivir sin]

Sí, probablemente podría hacer este " aumento de instancia " con un patrón de visitante. [No estoy seguro si podría obtener el azúcar sintético]

¿Comentarios?

¿Fue útil?

Solución

Bueno, podría crear una instancia de DynamicMethod para su " nuevo " métodos, pero asociarlos estáticamente a una instancia existente en tiempo de ejecución no funcionaría debido al hecho de que simplemente no se compilaría.

Usted podría (no he intentado esto) poder emitir los códigos de operación en un ensamblaje en memoria, pero eso está tan lejos de ser "sintácticamente dulce" como puede obtener (implicaría mucha reflexión y llamadas de InvokeMember, creo)

También podría valer la pena analizar los métodos de extensión, aunque nunca he intentado adjuntar eventos o métodos similares a los eventos a través de métodos de extensión ... y solo son 3.5, por lo que eso puede limitarlo.

El aspecto más bonito, "C # puro" la implementación es probablemente algo muy similar a lo que ya tienes con la configuración genérica / de interfaz ...

Honestamente, si está buscando algo con verdadero "soporte dinámico" así, haría este tipo de cosas en un lenguaje compatible con DLR (como IronPython) y llamaría desde sus cosas de C #.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top