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?
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");
via réflexion
var property = object.GetType().GetProperty("YourProperty")
property.SetValue(object,some_value,null);
Similaire est pour les méthodes
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;
}
}
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.