1 votes

c# objet dynamique Vérification du type en cours d'exécution

Apparemment, ce qui suit est valable en c# 4.0 quel que soit le type de l'objet renvoyé par GetADynamicThing()

dynamic d = GetADynamicThing();
d.Foo();

Et si le type d'exécution de d ne contient pas de méthode Foo(), une méthode RunTimeBinderException est lancé.

Y aura-t-il un facile moyen de déterminer si Foo() existe sur d ?

Sinon, nous sommes obligés de faire de la réflexion à l'ancienne sur l'objet, ou de compter sur try-catch. Je ne suis pas sûr d'aimer ces deux approches.

Mise à jour : Nous avons donc actuellement 3 options :

  1. Réflexion
  2. Attraper l'exception
  3. J'espère que GetADynamicThing() renvoie ce que vous attendez d'elle.

Le numéro 3 semble être l'utilisation ciblée de la dynamique qui en Les situations COM sont géniales . La raison pour laquelle j'ai posé la question à l'origine était en réponse au fait de faire quelque chose comme ceci c'est-à-dire en utilisant les méthodes d'un objet créé arbitrairement. Cela ressemble beaucoup à la mauvaise situation pour utiliser la dynamique.

5voto

Reed Copsey Points 315315

Le type dynamique n'est pas destiné à remplacer System.Object. Si vous n'avez AUCUNE idée de ce qui est renvoyé, l'utilisation de System.Object ou d'une interface concrète dans votre API reste une meilleure approche que l'utilisation de dynamic, même en C# 4.

La dynamique est très utile si vous savez, fondamentalement, ce que vous retournez. Vous devez traiter l'absence d'un membre (par exemple Foo) comme un cas exceptionnel, auquel cas l'exception est un moyen raisonnable de le gérer.

2voto

Andrew Hare Points 159332

L'objectif de la dynamic est d'assumer la présence des membres.

Si vous avez vraiment besoin de savoir avant d'appeler la méthode, utilisez la réflexion ou mieux encore, créez un type concret qui implémente une interface qui déclare Foo() . Je soutiens que si vous avez besoin de vérifier si Foo() est un membre d'un dynamic type, alors dynamic est le mauvais choix pour vous. Il semble que vous ayez besoin d'une vérification statique des types.

1voto

Jeff Yates Points 36725

Si votre architecture est tellement ouverte que vous n'avez aucune idée de ce qui est renvoyé par GetADynamicThing, vous devez soit attraper l'exception, soit utiliser la réflexion d'une manière ou d'une autre. Cependant, dans la plupart des scénarios, vous aurez une bonne idée de ce que vous devriez obtenir et pourrez faire quelques suppositions.

-1voto

Fredou Points 9553

S'il n'y a aucun moyen de le savoir maintenant, j'espère qu'ils le feront.

Cauchemar de la maintenance

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X