Je souhaite avoir un exemple simple de typage de canard en C# en utilisant des objets dynamiques. Il me semble qu'un objet dynamique devrait avoir des méthodes HasValue/HasProperty/HasMethod avec un seul paramètre de chaîne pour le nom de la valeur, de la propriété ou de la méthode que vous recherchez avant de tenter de l'exécuter. J'essaie d'éviter les blocs try/catch, et d'approfondir la réflexion si possible. Cela semble être une pratique courante pour le dactylographie dans les langages dynamiques (JS, Ruby, Python, etc.) qui consiste à tester une propriété/méthode avant de l'utiliser, puis de revenir à une valeur par défaut ou de lancer une exception contrôlée. . L'exemple ci-dessous est essentiellement ce que je veux accomplir.Test de type Duck avec C# 4 pour les objets dynamiques
Si les méthodes décrites ci-dessus n'existent pas, quelqu'un a-t-il des méthodes d'extension premade pour dynamic qui vont le faire? Exemple: En JavaScript, je peux tester assez facilement une méthode sur un objet.
//JavaScript
function quack(duck) {
if (duck && typeof duck.quack === "function") {
return duck.quack();
}
return null; //nothing to return, not a duck
}
Comment pourrais-je faire la même chose en C#?
//C# 4
dynamic Quack(dynamic duck)
{
//how do I test that the duck is not null,
//and has a quack method?
//if it doesn't quack, return null
}
Comme une note à tous ceux qui cherchent ... ExpandoObject (incertain des autres) implémente IDictionary pour que vous puissiez tester avec var myDynamicAsDictionary = myDyn comme IDictionary ; puis tester pour null, et .HasKey() –
Tracker1
duplication possible de [dynamique, Comment tester si une propriété est disponible] (http://stackoverflow.com/questions/2998954/dynamic-how-to-test-if-a -property-is-available) – nawfal
@nawfal mine était 2 jours plus tôt que celui que vous avez lié à ... Je pensais juste qu'il pourrait être possible de créer de telles méthodes de vérification avec des signatures de type génériques ... 'Duck.HasFunc (string name) 'comme exemple de signature ... Je n'utilise plus C# à ce niveau, mais ce serait intéressant. –
Tracker1