如何检查是否存在COM属性或方法未发生意外事件?(How to check if a COM pro

2019-06-26 09:16发布

我的工作是创建一个包含属性和/或方法名的字符串列表一些旧代码,然后尝试将这些属性或方法适用于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;
}

有用的文章至今

如何检查对象是否具有一定的方法/属性?

调用的IDispatch COM接口的从C#中的构件

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

Answer 1:

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

这里有人从C#调用它:

调用的IDispatch COM接口的从C#中的构件



文章来源: How to check if a COM property or method exists without generating an exception?
标签: c# com .net-3.5