如何在不生成exception的情况下检查COM属性或方法是否存在?

我正在研究一些遗留代码,它们创建包含属性和/或方法名称的字符串列表,然后尝试将这些属性或方法应用于COM对象。 COM对象的属性或方法不保证存在,它可以是属性或方法我不知道哪个。

目前,如果某个属性或方法不存在,则会将其作为COMexception捕获。 这导致性能不佳。 我试图找到一种方法来检查COM对象中是否存在属性或方法而不生成exception,以便在尝试应用它之前我可以检查它是否存在。

使用GetType返回类型System.com_object。 在System.com_object上使用GetProperty不起作用,因为这是确切的运行时类型,而不是它的派生类型。 相反,我必须使用InvokeMember,如果该成员不存在则会创建exception。 有没有人有更好的方法这样做?

我目前正在使用.NET 3.5 。 迁移到.NET 4目前不是一个选项,但如果新语言function提供了解决问题的更好方法,我仍然对.NET 4中的解决方案感兴趣。

public static bool CheckIfComPropertyOrMethodExists(T1 objectToCheck, string propertyOrMethodName) { if (CheckIfComPropertyExists(objectToCheck, propertyOrMethodName) == false & CheckIfComMethodExists(objectToCheck, propertyOrMethodName) == false) { return false; } { return true; } } public static bool CheckIfComPropertyExists(T1 objectToCheck, string propertyName) { return objectToCheck.GetType().InvokeMember(propertyName, BindingFlags.GetProperty, null, objectToCheck, null) != null; } public static bool CheckIfComMethodExists(T1 objectToCheck, string methodName) { return objectToCheck.GetType().GetMethod(methodName, BindingFlags.Public | BindingFlags.Instance) != null; } 

迄今为止有用的文章

如何检查对象是否具有某些方法/属性?

从C#调用IDispatch COM接口的成员

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

在c#中实现IDispatch

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

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

很可能COM类也实现了IDispatch接口。 然后,您可以使用其GetIDsOfNames来检查类中是否存在成员。

有人从C#调用它:

从C#调用IDispatch COM接口的成员