2011-02-25 15 views
120

Utilizzare il modello dinamico forse? Puoi chiamare qualsiasi metodo/proprietà usando la parola chiave dynamic, giusto? Come verificare se il metodo esiste prima di chiamare myDynamicObject.DoStuff(), ad esempio?Come verificare se un oggetto ha determinati metodi/proprietà?

+0

Qual è il tipo di * * myDynamicObject? È una classe derivata da 'DynamicObject'? –

+0

qualcosa dichiarato con la parola chiave dinamica –

risposta

180

Si potrebbe scrivere qualcosa di simile:

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

Edit: si può anche fare un metodo di estensione e usarlo come questo

myObject.HasMethod("SomeMethod"); 
+0

GetType() restituirà il tipo di runtime? (cioè non oggetto?) –

+2

sì, GetType() restituisce il tipo in esecuzione mentre typeof() restituisce l'oggetto. – Julien

+1

In base al documento GetType() restituirà "Il tipo di runtime esatto dell'istanza corrente". – tzup

14

Non sarebbe meglio non utilizzare alcun tipo dinamico per questo e lasciare che la classe implementasse un'interfaccia. Quindi, è possibile verificare in fase di esecuzione se un oggetto implementa tale interfaccia e, quindi, ha il metodo previsto (o la proprietà).

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 digitazione anatra, che è utile in scenari in cui sai già che l'oggetto ha il metodo, ma il compilatore non può controllarlo. Questo è utile negli scenari di interoperabilità COM, ad esempio. (controllare l'articolo this)

Se si desidera combinare la digitazione anatra con la riflessione, ad esempio, penso che manchi l'obiettivo della digitazione anatra.

+2

e se l'oggetto può essere un oggetto fornito dal framework .NET e non posso dichiararlo per implementare qualcosa? –

+0

Qual è il problema? È possibile verificare se l'oggetto è un tale oggetto, fornito dal framework .NET allo stesso modo –

+0

, ad esempio, si desidera verificare se esiste un metodo "Aggiungi" in un oggetto. E l'oggetto può essere una lista , o qualche altra classe che non è un IEnumerable –

64

via Riflessione

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

Simile è per i metodi

+0

Bello. Si potrebbe anche fare il GetMethod in un ciclo per ottenere la proprietà definita appropriata. – Jnr

32

È una vecchia domanda, ma ci ho appena provato. Type.GetMethod(string name) getterà un AmbiguousMatchException se non v'è più di un metodo con lo stesso nome, in modo da gestire meglio 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; 
    } 
} 
Problemi correlati