Como verificar se existe uma propriedade ou método COM sem gerar uma exceção?

Eu estou trabalhando em algum código legado que cria uma lista de seqüências de caracteres contendo nomes de propriedade e / ou método e, em seguida, tenta aplicar essas propriedades ou métodos a um objeto COM. A propriedade ou método para o objeto COM não é garantido para existir e poderia ser uma propriedade ou um método não sei qual.

No momento, se uma propriedade ou método não existir, será pego como uma exceção COM. Isso resulta em desempenho ruim. Eu estou tentando encontrar uma maneira de verificar se uma propriedade ou método existe em um objeto COM sem gerar uma exceção para que eu possa verificar sua existência antes de tentar aplicá-lo.

Usando GetType retorna tipo System.com_object. O uso de GetProperty no System.com_object não funciona, pois esse é o tipo exato de tempo de execução e não o tipo do qual é derivado. Em vez disso, tenho que InvokeMember que cria uma exceção se o membro não existir. Alguém tem uma maneira melhor de fazer isso?

Estou trabalhando em.NET 3.5 no momento. A migração para o .NET 4 não é uma opção no momento, mas eu ainda estaria interessado em soluções no .NET 4 se os novos recursos de linguagem fornecerem uma maneira melhor de resolver o problema.

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

Artigos úteis até agora

Como verificar se um objeto possui determinado método / propriedade?

Chamando um membro da interface COM IDispatch de c #

http://msdn.microsoft.com/pt-br/library/aa909091.aspx

Implementando IDispatch em c #

http://msdn.microsoft.com/pt-br/magazine/dd347981.aspx

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

questionAnswers(1)

yourAnswerToTheQuestion