web-dev-qa-db-fra.com

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

Vous utilisez peut-être un modèle dynamique? 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?

144
Louis Rhys

Vous pourriez écrire quelque chose comme ça:

public static bool HasMethod(this object objectToCheck, string 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");
210
Julien

via réflexion

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

Similaire est pour les méthodes

77
Stecya

C'est une vieille question, mais je l'ai juste rencontrée. Type.GetMethod(string name) lève une exception AmbiguousMatchException s'il existe plusieurs méthodes portant ce nom. Il est donc préférable de gérer ce cas.

public static bool HasMethod(this object objectToCheck, string 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;
    }
} 
41
esskar

Ne serait-il pas préférable de ne pas utiliser de types dynamiques pour cela et de laisser votre classe implémenter une interface. Ensuite, vous pouvez vérifier au moment de l'exécution si un objet implémente cette interface et a donc la méthode (ou 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 dont vous parlez est le type de canard, ce qui est utile dans les scénarios où vous savez déjà que l'objet possède la méthode, mais que le compilateur ne peut pas vérifier. Ceci est utile dans les scénarios d'interopérabilité COM, par exemple. (cochez this article)

Si vous voulez combiner la frappe de canard avec la réflexion, par exemple, alors je pense que vous ratez l'objectif de la frappe de canard.

16
Frederik Gheysels