2012-07-18 10 views
1

我正在创建一些遗留代码,它创建包含属性和/或方法名称的字符串列表,然后尝试将这些属性或方法应用于COM对象。不保证COM对象的属性或方法存在,它可以是属性或方法,我不知道哪个属性或方法。如何检查COM属性或方法是否存在,而不会产生异常?

此刻,如果某个属性或方法不存在,它将作为COM异常被捕获。这导致性能不佳。我试图找到一种方法来检查COM对象中是否存在一个属性或方法,但不会生成异常,以便在尝试应用它之前检查它是否存在。

使用GetType返回类型System.com_object。在System.com_object上使用GetProperty不起作用,因为这是确切的运行时类型,不是它的派生类型。相反,如果成员不存在,我必须创建一个异常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; 
} 

有用的文章至今

How to check whether an object has certain method/property?

Calling a member of IDispatch COM interface from C#

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

Implementing IDispatch in 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

不要忘记过滤掉 “FormatDrive” 的方法。 – 2012-07-18 13:08:19

回答

1

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

这里有人从C#调用它:

Calling a member of IDispatch COM interface from C#

+0

谢谢你的回答。我认为GetIDsOfNames将解决这个问题。我会很快接受你的答案。我想知道你是否会介意扩大你的答案,因为我很难理解http://stackoverflow.com/questions/8068449/calling-a-member-of-idispatch-com-interface-from-c-尖锐。我正在尝试访问Microsoft.Office.Interop.Excel的成员。如果我不知道我正在使用GetIDsOfNames的类的基础类型,我该如何为一个类使用GetIDsOfNames?我拥有的是一个System.com_object。这可以是Microsoft.Office.Interop.Excel中的任何类型namspce – dior001 2012-07-18 12:58:17

+1

您只需将您的COM对象转换为IDispatch,它与对象的类型无关,它确实实现了IDispatch。 – 2012-07-18 16:26:55

+0

如果成员不存在,GetIDsofNames将引发DISP_E_UNKNOWNNAME COM异常。这意味着我仍然有相同的性能问题。任何想法如何做到这一点,没有例外?我尝试了以下的http://stackoverflow.com/questions/11665813/object-of-type-system-int32-cannot-be-converted-to-type-system-uint32没有任何成功。 – dior001 2012-07-30 13:16:58

相关问题