PropertyInfo.GetProperty在不应该返回null的情况下返回null

3

我想获取WPF WebBrowser对象的私有属性值。在调试器中可以看到它具有非空值。

PropertyInfo activeXProp = Browser.GetType().GetProperty("ActiveXInstance", BindingFlags.Instance | BindingFlags.NonPublic);
object activeX = activeXProp.GetValue(Browser, null); // here I get null for the activeX value
activeX.GetType().GetProperty("Silent").SetValue(activeX, true); // and here it crashes for calling a method on a null reference...

我猜测我没有正确使用反射,但是在这种情况下应该如何正确地使用呢? 该项目是一个在.NET 4.6.1和Windows 10上运行的WPF项目。 我尝试以管理员权限运行它(添加到项目中的清单文件),但是没有任何改变。


2
你确定 activeXnull 吗?它并没有返回 null。 - undefined
感谢你尝试了一下。不幸的是,它确实给了我一个空值。如果你想检查的话,这是完整的项目链接:https://github.com/zskolbay/WpfBrowserTest - undefined
我在github上测试了你的代码,'activeX' 不是空值。只有下一行会抛出一个异常。 - undefined
activeX.GetType().GetProperty("Silent") 返回了 null - undefined
如果activeX确实为空,那就是在没有创建窗口并尝试访问它时为空。 - undefined
1个回答

3
activeX.GetType() 返回的类型是 System.__ComObject,不支持这种反射。但是,有两个简单的解决方案。

使用 dynamic

dynamic activeX = activeXProp.GetValue(Browser, null);
activeX.Silent = true;

dynamic支持通过IDispatch COM接口(由所有ActiveX元素实现)提供的所有类型的COM反射。

仅反射

将您的代码稍作更改即可实现与上述代码相同的效果:

object activeX = activeXProp.GetValue(Browser, null);
activeX.GetType().InvokeMember("Silent", BindingFlags.SetProperty, null, activeX, new object[]{true});

这两种方法在对象上调用的是同一个东西,但我猜第一种方法由于呼叫点的缓存,随着时间的推移会更快。只有当您无法出于某种原因使用 dynamic 时,才使用第二种方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接