Pergunta

métodos

C # 3.0 Extensão adicionar extensões para o tipo de base que fazem chamar esse método em todos os casos desse tipo legal.

Agora, JavaScript Eu sei implementos IDispatchEx através do qual é possível adicionar métodos a uma instância específica.

Então, como faço para adicionar um conjunto de métodos para um 'exemplo' de uma classe C #? Eu sei que este é um dinâmico vs. estáticos Línguas território guerra santa. :) Deixe-me esclarecer a minha intenção não é isso.

Eu só quero ser capaz de adicionar um conjunto de eventos para uma interface dependendo da classe que implementa essa interface.

Eu era capaz de fazer isso 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 += ...
    }  
}  

Então eu não gostava SupportedEvents eu quero ser capaz de dizer

new Sample().Clicked +=...

Então eu pensei JavaScript (eu sei C# não é JS:)) ... E IDispatchEx, IL Weaving, Reflection.Emit etc. etc. e pensamento pode ser que há uma maneira de fazer isso ... [projeto de apoio tempo seria bom mas eu posso viver sem]

Sim, eu provavelmente poderia fazer isso "aumento instância" com um padrão Visitor. [Não tenho certeza se eu poderia obter o açúcar sintático embora]

Comentários?

Foi útil?

Solução

Bem, você poderia criar uma instância DynamicMethod para os seus "novos" métodos, mas estaticamente anexá-los a uma instância existente em tempo de execução não iria funcionar devido ao fato claro não compilar.

Você pode (eu não tentei isso) ser capaz de emitir os opcodes em um in-memory montagem, mas isso é quase tão longe de ser "Sintaticamente doce", como você pode obter ( envolveria um monte de chamadas de reflexão e InvokeMember, eu acho)

Ele também pode valer a pena olhar em Métodos de extensão -. Embora eu nunca tentou anexar eventos ou métodos através de métodos de extensão evento semelhante ... e eles são 3,5 única, de modo que pode limitá-lo

O mais bonitos que procuram, "puro C #" implementação é provavelmente algo muito semelhante ao que você já tem com a configuração de interface / generic ...

Honestamente, se você está procurando algo com verdadeiro "suporte dinâmico" como este, eu faria esse tipo de coisa em uma linguagem DLR-capazes (como IronPython) e chamada para ele a partir de seu C # coisas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top