Как проверить, существует ли свойство или метод COM без генерации исключения?

Я работаю над неким устаревшим кодом, который создает список строк, содержащих имена свойств и / или методов, а затем пытается применить эти свойства или методы к COM-объекту. Свойство или метод для COM-объекта не гарантируется, и это может быть либо свойство, либо метод, который я не знаю, какой.

В настоящий момент, если свойство или метод не существует, оно перехватывается как исключение COM. Это приводит к плохой производительности. Я пытаюсь найти способ проверить, существует ли свойство или метод в COM-объекте, не генерируя исключение, чтобы я мог проверить его существование, прежде чем пытаться применить его.

Использование GetType возвращает тип System.com_object. Использование GetProperty на System.com_object не работает, поскольку это точный тип времени выполнения, а не тип, из которого он получен. Вместо этого мне нужно InvokeMember, который создает исключение, если элемент не существует. У кого-нибудь есть лучший способ сделать это?

Я работаю в.NET 3.5 в данный момент. Миграция на .NET 4 в настоящее время не вариант, но я по-прежнему заинтересован в решениях для .NET 4, если новые языковые функции обеспечивают лучший способ решения проблемы.

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

Полезные статьи до сих пор

Как проверить, есть ли у объекта определенный метод / свойство?

Вызов члена интерфейса COM IDispatch из C #

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

Реализация IDispatch в 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

Ответы на вопрос(1)

Ваш ответ на вопрос