我正在处理一些遗留代码,它创建了一个字符串列表,其中包含属性和/或方法名称,并尝试将这些属性或方法应用于COM对象。不能保证COM对象的属性或方法存在,而且我不知道它是属性还是方法。
目前,如果属性或方法不存在,它会被捕获为COM异常。这会导致性能下降。我正在尝试找到一种方法,在尝试应用属性或方法之前检查COM对象中是否存在属性或方法,而不生成异常。
使用GetType返回类型System.com_object。在System.com_object上使用GetProperty无效,因为这是确切的运行时类型,而不是它派生自的类型。相反,我必须使用InvokeMember,如果成员不存在,则会创建异常。有没有更好的方法来解决这个问题?
我目前在.NET 3.5中工作。迁移到.NET 4目前不是一个选项,但如果新的语言特性提供了更好的解决方案,我仍然对.NET 4中的解决方案感兴趣。
目前,如果属性或方法不存在,它会被捕获为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;
}
迄今为止有用的文章
http://msdn.microsoft.com/en-us/library/aa909091.aspx