Wie überprüfe ich, ob eine COM-Eigenschaft oder -Methode existiert, ohne eine Ausnahme zu generieren?

Ich arbeite an einem älteren Code, der eine Liste von Zeichenfolgen erstellt, die Eigenschafts- und / oder Methodennamen enthalten, und dann versucht, diese Eigenschaften oder Methoden auf ein COM-Objekt anzuwenden. Es wird nicht garantiert, dass die Eigenschaft oder Methode für das COM-Objekt vorhanden ist, und es kann sich entweder um eine Eigenschaft oder eine Methode handeln, von der ich nicht weiß, welche.

Derzeit wird eine Eigenschaft oder Methode als COM-Ausnahme abgefangen, wenn sie nicht vorhanden ist. Dies führt zu einer schlechten Leistung. Ich versuche zu überprüfen, ob eine Eigenschaft oder eine Methode in einem COM-Objekt vorhanden ist, ohne eine Ausnahme zu generieren, damit ich die Existenz überprüfen kann, bevor ich versuche, sie anzuwenden.

Bei Verwendung von GetType wird der Typ System.com_object zurückgegeben. Die Verwendung von GetProperty auf System.com_object funktioniert nicht, da dies der genaue Laufzeittyp ist, nicht der Typ, von dem er abgeleitet ist. Stattdessen muss ich InvokeMember, die eine Ausnahme erstellt, wenn das Mitglied nicht vorhanden ist. Hat jemand eine bessere Möglichkeit, dies zu tun?

Ich arbeite in.NET 3.5 im Moment. Die Migration auf .NET 4 ist derzeit keine Option, aber ich würde mich immer noch für Lösungen in .NET 4 interessieren, wenn die neuen Sprachfunktionen eine bessere Möglichkeit zur Lösung des Problems bieten.

public static bool CheckIfComPropertyOrMethodExists<T1>(T1 objectToCheck, string propertyOrMethodName)
{
    if (CheckIfComPropertyExists(objectToCheck, propertyOrMethodName) == false & CheckIfComMethodExists(objectToCheck, propertyOrMethodName) == false) {
        return false;
    }
    {
        return true;
    }
}

public static bool CheckIfComPropertyExists<T1>(T1 objectToCheck, string propertyName)
{
    return objectToCheck.GetType().InvokeMember(propertyName, BindingFlags.GetProperty, null, objectToCheck, null) != null;
}

public static bool CheckIfComMethodExists<T1>(T1 objectToCheck, string methodName)
{
    return objectToCheck.GetType().GetMethod(methodName, BindingFlags.Public | BindingFlags.Instance) != null;
}

Bisher hilfreiche Artikel

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

Aufrufen eines Mitglieds der IDispatch-COM-Schnittstelle über C #

http://msdn.microsoft.com/en-us/library/aa909091.aspx

Implementieren von IDispatch in c #

http://msdn.microsoft.com/en-us/magazine/dd347981.aspx

http://blogs.msdn.com/b/lucian/archive/2008/10/06/reflection-on-com-objects.aspx

Antworten auf die Frage(1)

Ihre Antwort auf die Frage