Usi il modello dinamico forse? Puoi chiamare qualsiasi metodo / proprietà usando la parola chiave dinamica, giusto? Come verificare se il metodo esiste prima di chiamare myDynamicObject.DoStuff (), ad esempio?
Usi il modello dinamico forse? Puoi chiamare qualsiasi metodo / proprietà usando la parola chiave dinamica, giusto? Come verificare se il metodo esiste prima di chiamare myDynamicObject.DoStuff (), ad esempio?
Risposte:
Potresti scrivere qualcosa del genere:
public static bool HasMethod(this object objectToCheck, string methodName)
{
var type = objectToCheck.GetType();
return type.GetMethod(methodName) != null;
}
Modifica: puoi persino fare un metodo di estensione e usarlo in questo modo
myObject.HasMethod("SomeMethod");
tramite la riflessione
var property = object.GetType().GetProperty("YourProperty")
property.SetValue(object,some_value,null);
Simile è per i metodi
GetType()
c'è metodo come GetProperties()
. Sta tornando array di PropertyInfo
. Ma come posso usare il GetProperties()
metodo?
È una vecchia domanda, ma mi sono appena imbattuto.
Type.GetMethod(string name)
genererà AmbiguousMatchException se esiste più di un metodo con quel nome, quindi è meglio gestire quel caso
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;
}
}
Non sarebbe meglio non usare alcun tipo dinamico per questo, e lasciare che la tua classe implementasse un'interfaccia. Quindi, è possibile verificare in fase di esecuzione se un oggetto implementa quell'interfaccia e quindi ha il metodo (o proprietà) previsto.
public interface IMyInterface
{
void Somemethod();
}
IMyInterface x = anyObject as IMyInterface;
if( x != null )
{
x.Somemethod();
}
Penso che questo sia l'unico modo corretto.
La cosa a cui ti riferisci è la tipizzazione anatra, che è utile in scenari in cui sai già che l'oggetto ha il metodo, ma il compilatore non può verificarlo. Ciò è utile, ad esempio, negli scenari di interoperabilità COM. (controlla questo articolo)
Se ad esempio si desidera combinare la tipizzazione con l'anatra con la riflessione, penso che manchi l'obiettivo di scrivere con l'anatra.
DynamicObject
?