Pergunta

Atualmente estou pesquisando a 2ª edição do C # em profundidade, e tentando implementar "protocolo buffers dinâmicos" - nível ou seja, um apoio dinâmico no topo da minha biblioteca de buffer de protocolo existente. Como tal, que tem um tipo DlrMessage derivado de DynamicObject. Depois de um pouco de jogar em torno de eu consegui obtê-lo para responder às propriedades simples com muito pouco código, mas eu quero ir muito mais longe. - E para realmente entender o que está acontecendo

Até agora eu não encontrei qualquer boas explicações do DLR - e muitos dos posts são efetivamente fora da data agora, como as coisas mudaram (eu acredito) entre a CTP anterior e .NET 4.0 beta 1. a documentação do MSDN para DynamicObject é muito mínima no momento.

A minha consulta mais imediata é se existe uma maneira simples de dizer, "Use reflexão para ligar todas as chamadas que não pode segurar, utilizando este objeto particular." (Em outras palavras, eu quero aumentar a ligação em vez de fazer tudo sozinho, se possível reflexão existente.) Infelizmente eu não estou recebendo muito longe por adivinhação.

Existem quaisquer fontes definitivas e recentes de documentação que eu deveria saber? Estou ciente de que parte da escrita sobre uma nova tecnologia é exploração, mas uma mão de ajuda seria apreciada:)

Foi útil?

Solução

Melhor fonte que eu encontrei e ler com frequência é a última anos no valor de posts Chris Burrow sobre seu blog .

Há também a que está fora da site principal DLR .

Outras dicas

Eu também estou pesquisando isso no momento e não há muita informação ainda. Eu não posso ajudar com sua consulta, mas abaixo estão algumas informações que eu encontrei:

Há uma quantidade justa dentro dos vídeos PDC.

http://channel9.msdn.com/pdc2008/TL44/

http://channel9.msdn.com/pdc2008/TL10/

Este artigo fala sobre como o DLR trabalha com IronPython: http://msdn.microsoft.com/en-us/magazine/cc163344.aspx

Há uma quantidade muito pequena na visualização kit de treinamento em: http://www.microsoft.com/downloads/details.aspx?FamilyID=752cb725-969b-4732-a383-ed5740f02e93&displayLang=en

Espero que isso ajude

Alex

Por DynamicObject padrão vai dizer "fallback para reflexão" se o seu Try * funções retornar falso. Então você já pode herdar e adicionar propriedades / campos / métodos para sua subclasse que tudo será tratado por reflexão se o caminho dinâmico não fazer a pesquisa.

Indo mais a fundo que você pode querer olhar para IDynamicMetaObjectProvider. Neste nível inferior a maneira de dizer fallback para a reflexão é chamar o Fallback * método no DynamicMetaObjetBinder entrada. Isso, então, permite que a língua chamando para fornecer a resolução. Você pode então voltar que AST ou compor-lo em um AST maior whcih você voltar. Basicamente Fallback * deixá-lo começar a AST que a linguagem chamando produziria incluindo o de corrigir o erro (exceção, indefinido na JS, etc ...).

A forma DynamicObject faz o fallback para reflexão é que ele realmente chama da pasta Fallback * método duas vezes. A primeira vez que ele cai para trás sem um parâmetro "errorSuggestion". Isto torna-se tanto o erro ou a AST, que foi construída usando a reflexão. Em seguida, ele produz um AST que é algo como:

if(TryGetMember("name", out value)) {
   return value;
} else {
   return resultOffallback;
}

Em seguida, leva este AST combinado e realmente entrega-nos como a sugestão de erro para a pasta em uma segunda alternativa. O ligante deve então respeitar esta errorSuggestion se a ligação não for bem sucedida. Mas, se o membro do .NET está presente, em seguida, errorSuggestion é jogado fora e vinculativa a NET tem precedência. E, finalmente, se o idioma não sabe se a ligação foi bem sucedida (por exemplo, a língua tem um "método faltando" característica tipo) pode novamente combinar as ASTs w / é verificações dinâmicas. Então, usando Fallback você não só pode dizer fazer reflexão, mas também você pode escolher se dinâmico ou membros estáticos têm precedência.

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