it-swarm.com.de

Wie überprüfe ich, ob ein Objekt eine bestimmte Methode / Eigenschaft hat?

Verwenden Sie vielleicht ein dynamisches Muster? Sie können jede Methode/Eigenschaft mit dem Schlüsselwort dynamic aufrufen, oder? Wie prüfe ich, ob die Methode existiert, bevor ich beispielsweise myDynamicObject.DoStuff () aufrufe?

144
Louis Rhys

Sie könnten so etwas schreiben:

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

Bearbeiten: Sie können sogar eine Erweiterungsmethode erstellen und so verwenden

myObject.HasMethod("SomeMethod");
210
Julien

über Reflexion

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

Ähnliches gilt für Methoden

77
Stecya

Es ist eine alte Frage, aber ich bin nur darauf gestoßen. Type.GetMethod(string name) löst eine AmbiguousMatchException aus, wenn es mehr als eine Methode mit diesem Namen gibt. Daher sollten wir diesen Fall besser behandeln

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

Wäre es nicht besser, dafür keine dynamischen Typen zu verwenden und Ihre Klasse eine Schnittstelle implementieren zu lassen? Anschließend können Sie zur Laufzeit prüfen, ob ein Objekt diese Schnittstelle implementiert und somit die erwartete Methode (oder Eigenschaft) aufweist.

public interface IMyInterface
{
   void Somemethod();
}


IMyInterface x = anyObject as IMyInterface;
if( x != null )
{
   x.Somemethod();
}

Ich denke das ist der einzig richtige Weg.

Das, worauf Sie sich beziehen, ist Enten-Typisierung, was in Szenarien nützlich ist, in denen Sie bereits wissen, dass das Objekt die Methode hat, der Compiler dies jedoch nicht überprüfen kann. Dies ist beispielsweise in COM-Interop-Szenarien nützlich. (check this article)

Wenn Sie zum Beispiel Ententypisierung mit Reflektion kombinieren möchten, dann vermissen Sie meines Erachtens das Ziel der Ententypisierung.

16