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 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?
Réponses:
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");
par réflexion
var property = object.GetType().GetProperty("YourProperty")
property.SetValue(object,some_value,null);
Il en va de même pour les méthodes
GetType()
y a une méthode comme GetProperties()
. Il renvoie un tableau de PropertyInfo
. Mais comment utiliser la GetProperties()
méthode?
C'est une vieille question, mais je viens de la rencontrer.
Type.GetMethod(string name)
lèvera une AmbiguousMatchException s'il y a plus d'une méthode avec ce nom, donc nous ferons mieux 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, par conséquent, possède 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 manière correcte.
La chose à laquelle vous faites référence est le typage canard, ce qui est utile dans les scénarios où vous savez déjà que l'objet a la méthode, mais 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 la frappe de canard avec la réflexion, par exemple, je pense que vous manquez l'objectif de la frappe de canard.
DynamicObject
?