c# länge - Wie überprüft man, ob ein Objekt eine bestimmte Methode / Eigenschaft besitzt?





für meta (5)


über Reflexion

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

Ähnliches gilt für Methoden

Dynamisches Muster vielleicht verwenden? Sie können jede Methode / Eigenschaft mit dem dynamischen Schlüsselwort aufrufen, richtig? Wie überprüfe ich, ob die Methode vor dem Aufruf von myDynamicObject.DoStuff () existiert?




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

public interface IMyInterface
{
   void Somemethod();
}


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

Ich denke, das ist der einzig richtige Weg.

Die Sache, auf die du dich beziehst, ist die Duck-Typisierung, die in Szenarien nützlich ist, in denen du bereits weißt, dass das Objekt die Methode hat, aber der Compiler kann das nicht überprüfen. Dies ist zum Beispiel in COM-Interop-Szenarien nützlich. (siehe this Artikel)

Wenn du zum Beispiel Duck-Typing mit Reflection kombinieren willst, dann vermisse ich das Ziel des Enten-Tippens.




Es ist eine alte Frage, aber ich bin einfach reingerannt. Type.GetMethod(string name) eine AmbiguousMatchException aus, wenn mehr als eine Methode mit diesem Namen vorhanden ist. Type.GetMethod(string name) 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;
    }
} 



Du könntest so etwas schreiben:

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

Edit: Sie können sogar eine Erweiterungsmethode verwenden und sie so verwenden

myObject.HasMethod("SomeMethod");



Basierend auf @ MarcGravells Antwort, hier ist eine Version, die in Unity C # funktioniert.

ObjectsClass foo = this;
foreach(var prop in foo.GetType().GetProperties()) {
    Debug.Log("{0}={1}, " + prop.Name + ", " + prop.GetValue(foo, null));
}




c# .net methods reflection properties