4

我正在处理一些遗留代码,它创建一个包含属性和/或方法名称的字符串列表,然后尝试将这些属性或方法应用于 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;
}

到目前为止有用的文章

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

从 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

4

1 回答 1

1

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

这里有人从 C# 调用它:

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

于 2012-07-18T12:17:42.660 回答