gpt4 book ai didi

c# - 如何在不产生异常的情况下检查 COM 属性或方法是否存在?

转载 作者:行者123 更新时间:2023-11-30 17:59:08 29 4
gpt4 key购买 nike

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

最佳答案

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

这里有人用 C# 调用它:

Calling a member of IDispatch COM interface from C#

关于c# - 如何在不产生异常的情况下检查 COM 属性或方法是否存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11540553/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com