如何在不生成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接口的成员