Jak sprawdzić, czy właściwość lub metoda COM istnieje bez generowania wyjątku?

Pracuję nad jakimś starszym kodem, który tworzy listę ciągów zawierających nazwy właściwości i / lub metod, a następnie próbuje zastosować te właściwości lub metody do obiektu COM. Właściwość lub metoda dla obiektu COM nie ma gwarancji istnienia i może to być właściwość lub metoda, której nie wiem.

W tej chwili, jeśli właściwość lub metoda nie istnieje, jest to wyjątek COM. Powoduje to słabą wydajność. Usiłuję znaleźć sposób sprawdzenia, czy właściwość lub metoda istnieje w obiekcie COM bez generowania wyjątku, dzięki czemu mogę sprawdzić jego istnienie przed próbą jego zastosowania.

Przy użyciu GetType zwraca typ obiektu System.com_object. Używanie GetProperty w obiekcie System.com_object nie działa, ponieważ jest to dokładny typ środowiska wykonawczego, a nie typ, z którego pochodzi. Zamiast tego muszę InvokeMember, który tworzy wyjątek, jeśli element nie istnieje. Czy ktoś ma lepszy sposób na zrobienie tego?

Pracuję w.NET 3.5 w tym momencie. Migracja do .NET 4 nie jest obecnie opcją, ale nadal będę zainteresowany rozwiązaniami w .NET 4, jeśli nowe funkcje językowe zapewnią lepszy sposób rozwiązania problemu.

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;
}

Pomocne artykuły do ​​tej pory

Jak sprawdzić, czy obiekt ma określoną metodę / właściwość?

Wywołanie członka interfejsu IDispatch COM z C #

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

Implementacja IDispatch w 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

questionAnswers(1)

yourAnswerToTheQuestion