Comment vérifier si un object a une certaine méthode / propriété?

En utilisant le pattern dynamic peut-être? Vous pouvez appeler n’importe quelle méthode / propriété en utilisant le mot-clé dynamic, non? Comment vérifier si la méthode existe avant d’appeler myDynamicObject.DoStuff (), par exemple?

Vous pourriez écrire quelque chose comme ça:

 public static bool HasMethod(this object objectToCheck, ssortingng methodName) { var type = objectToCheck.GetType(); return type.GetMethod(methodName) != null; } 

Edit: vous pouvez même faire une méthode d’extension et l’utiliser comme ça

 myObject.HasMethod("SomeMethod"); 

via la reflection

  var property = object.GetType().GetProperty("YourProperty") property.SetValue(object,some_value,null); 

Similaire pour les méthodes

C’est une vieille question, mais je viens de le rencontrer. Type.GetMethod(ssortingng name) lancera une exception AmbiguousMatchException s’il y a plus d’une méthode avec ce nom, donc nous ferons mieux de gérer cette casse

 public static bool HasMethod(this object objectToCheck, ssortingng methodName) { try { var type = objectToCheck.GetType(); return type.GetMethod(methodName) != null; } catch(AmbiguousMatchException) { // ambiguous means there is more than one result, // which means: a method with that name does exist return true; } } 

Ne serait-il pas préférable de ne pas utiliser de types dynamics pour cela, et de laisser votre classe implémenter une interface. Ensuite, vous pouvez vérifier à l’exécution si un object implémente cette interface, et donc avoir la méthode (ou la propriété) attendue.

 public interface IMyInterface { void Somemethod(); } IMyInterface x = anyObject as IMyInterface; if( x != null ) { x.Somemethod(); } 

Je pense que c’est la seule façon correcte.

La chose à laquelle vous faites référence est Duck-typing, ce qui est utile dans les scénarios où vous savez déjà que l’object a la méthode, mais que le compilateur ne peut pas vérifier cela. Ceci est utile dans les scénarios d’interopérabilité COM par exemple. (consultez cet article)

Si vous voulez combiner le typage de canard avec la reflection par exemple, alors je pense que vous manquez l’objective de la frappe de canard.