Question

Je recherche actuellement la 2e édition de C # en profondeur, et d'essayer de mettre en œuvre « des tampons de protocole dynamiques » - à savoir un niveau de soutien dynamique au-dessus de ma bibliothèque tampon de protocole existant. En tant que tel, j'ai un type de DlrMessage dérivé de DynamicObject. Après un peu de jouer autour J'ai réussi à l'obtenir pour répondre aux propriétés simples avec le code remarquablement peu, mais je veux aller beaucoup plus loin -. Et de comprendre vraiment ce qui se passe

Jusqu'à présent, je ne l'ai pas trouvé de bonnes explications du DLR - et beaucoup de messages de blog sont effectivement maintenant obsolètes, comme les choses ont changé (je crois) entre la CTP précédente et .NET 4.0 beta 1. documentation MSDN pour DynamicObject est assez minime pour le moment.

Ma requête la plus immédiate est de savoir s'il y a un moyen simple de dire: « la réflexion Utiliser pour lier tous les appels que je ne peux pas gérer, en utilisant cet objet particulier. » (En d'autres termes, je veux augmenter la réflexion liaison existante plutôt que de faire tout moi-même, si possible.) Malheureusement, je ne reçois pas très loin par devinettes.

Y a-t-il des sources définitives et récentes de la documentation que je devrais savoir? Je suis conscient qu'une partie de l'écriture sur une nouvelle technologie exploration, mais un coup de main serait apprécié:)

Était-ce utile?

La solution

meilleure source que j'ai trouvé et lu est souvent les dernières années d'une valeur de messages de Chris Burrow sur son blog .

Il y a aussi les documentation DLR page officielle qui est hors de la .

Autres conseils

Par défaut DynamicObject dira "fallback à la réflexion" si vos fonctions Try * return false. Ainsi, vous pouvez déjà hériter et ajouter des propriétés / champs / méthodes à votre sous-classe qui seront tous pris en charge par la réflexion si le chemin dynamique ne fait pas la recherche.

Aller plus en profondeur, vous voudrez peut-être regarder IDynamicMetaObjectProvider. A ce niveau bas comme vous dites fallback à la réflexion est d'appeler la méthode sur le * Repli DynamicMetaObjetBinder entrant. Cela permet alors la langue d'appel pour obtenir la résolution. Vous pouvez ensuite revenir qu'AST ou composer dans un plus grand AST whcih votre retour. Fondamentalement * vous permettent de Fallback obtenir le AST que la langue d'appel produirait, y compris l'erreur correcte (exception, non définie dans JS, etc ...).

La façon dont DynamicObject fait la réflexion est à fallback qu'il appelle en fait la méthode du * Repli liant deux fois. La première fois, il retombe sans paramètre « errorSuggestion ». Cela devient soit l'erreur ou l'AST qui a été construit en utilisant la réflexion. Il produit alors un AST qui est quelque chose comme:

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

Il faut alors ce AST combiné et remet réellement comme la suggestion d'erreur pour le liant sur un 2ème repli. Le liant doit alors respecter cette errorSuggestion si la liaison échoue. Mais si le membre .NET est présent, errorSuggestion est jeté et la liaison .NET est prioritaire. Et enfin, si la langue ne sait pas si la liaison a réussi (par exemple la langue a une fonction de type « méthode manquante »), il peut encore combiner les RSHS w / il est des contrôles dynamiques. Donc, en utilisant Fallback vous ne pouvez pas seulement dire faire la réflexion, mais vous pouvez aussi choisir les membres dynamiques ou statiques ont priorité.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top