¿Cómo verificar si existe una propiedad o método COM sin generar una excepción?
Estoy trabajando en un código heredado que crea una lista de cadenas que contienen nombres de propiedades y / o métodos y luego intenta aplicar esas propiedades o métodos a un objeto COM. No se garantiza que exista la propiedad o el método para el objeto COM y podría ser una propiedad o un método que no sé cuál.
En este momento, si una propiedad o método no existe, se captura como una excepción COM. Estos resultados son pobres en rendimiento. Estoy tratando de encontrar una manera de verificar si existe una propiedad o un método en un objeto COM sin generar una excepción para que pueda verificar su existencia antes de intentar aplicarlo.
Usando GetType devuelve el tipo System.com_object. El uso de GetProperty en System.com_object no funciona, ya que este es el tipo de tiempo de ejecución exacto, no el tipo del que se deriva. En su lugar, tengo que InvokeMember, que crea una excepción si el miembro no existe. ¿Alguien tiene una mejor manera de hacer esto?
Estoy trabajando en.NET 3.5 En el momento. La migración a .NET 4 no es una opción en este momento, pero me seguirían interesando las soluciones en .NET 4 si las nuevas características del idioma brindan una mejor manera de resolver el 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;
}
Artículos útiles hasta ahora
¿Cómo verificar si un objeto tiene cierto método / propiedad?
Llamando a un miembro de la interfaz COM de IDispatch desde C #
http://msdn.microsoft.com/en-us/library/aa909091.aspx
Implementando IDispatch en 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