2010-10-20 20 views
5

J'ai un certain nombre de méthodes d'accès aux données qui acceptent un paramètre d'objet dynamique (c.-à-d., Foo dynamique). Je ne peux pas utiliser une interface pour définir pour taper le paramètre d'entrée en raison du code existant. Je définis des propriétés dans les méthodes d'accès aux données, mais l'utilisation de dynamiques sans vérifier si les propriétés/méthodes existent me rend nerveux. Je cherche donc un moyen de vérifier les propriétés/méthodes d'exécution d'un objet dynamique, mais je préférerais ne pas utiliser la réflexion en raison de l'impact sur les performances. Existe-t-il une autre méthode recommandée pour interroger les propriétés/méthodes d'un objet dynamique?Est-ce que la réflexion est la meilleure façon de déterminer la présence/absence de propriété/méthode sur un objet dynamique?

Merci, Erick

+0

Vous ne voulez pas utiliser la réflexion en raison de l'impact sur les performances, mais vous êtes heureux d'utiliser * dynamic *? –

+0

@Kirk: Dynamique fonctionne étonnamment bien. C'est un peu plus rapide que la réflexion pour accéder aux membres ... –

+1

Vous pensez que ce sera un impact sur les performances ou vous le savez? Les décisions de conception sont mieux prises sur des faits. – smirkingman

Répondre

2

La réflexion ne fonctionne pas réellement (comme vous l'attendez) sur les types dynamic. Vous devez vérifier IDynamicMetaObjectProvider, puis utiliser ses méthodes pour déterminer si un membre est disponible sur le type.

Le problème est qu'il est parfaitement acceptable pour un type dynamic d'ajouter de nouveaux membres lors de l'exécution. Pour un exemple, voir ExpandoObject. Il ajoute que de nouveaux membres sur les opérations de réglage, mais vous pouvez, tout aussi facilement, faire un type dynamique qui renvoie toujours un membre valide, peu importe ce qui est passé en elle, à savoir:

dynamic myType = new DynamicFoo(); 
Console.WriteLine(myType.Foo); 
Console.WriteLine(myType.Bar); 
Console.WriteLine(myType.Baz); 

Cela peut se faire par surcharger l'accesseur get, et juste les rendre toujours valides. Dans ce cas, la réflexion n'aurait aucun moyen de dire ce qui fonctionnerait ici ...

+0

Reed, c'est la réponse dont j'avais besoin, mais j'ai décidé de prendre l'approche de l'essayer et de laisser l'exception se faire sentir. Merci! –

2

je regardais ce problème un peu différemment. Si vous utilisez les objets avec dynamic, il est inutile de savoir si les propriétés sont accessibles par réflexion. Cela n'a d'importance que s'ils sont accessibles via dynamic. Alors pourquoi ne pas simplement utiliser les propriétés et attraper l'exécution qui résulterait de leur absence?

+0

+1 de moi - ce serait mon approche. Utilisez simplement l'objet et gérez les exceptions comme si elles venaient. –

+0

@Reed, félicitations sur 100K! – JaredPar

+0

Merci! Je viens de passer ce matin: D –