PropertyInfo.GetProperty 在不应该返回 null 时返回 null



我正在尝试获取WPF WebBrowser对象的私有属性的值。我可以在调试器中看到它有一个非null值。

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...

我的猜测是我没有以正确的方式使用反射,但在这种情况下,正确的方法是什么?该项目是在上运行的WPF项目。NET 4.6.1和Windows 10。我试着用管理员权限运行它(向项目中添加一个清单文件(,但没有什么不同。

activeX.GetType()返回的类型为System__ComObject,它不支持这种反射。然而,有两个简单的解决方案。

使用dynamic

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

dynamic支持所有类型的COM反射,由IDispatchCOM接口提供(由所有ActiveX元素实现(。

仅反射

对您的代码进行的一个小更改与上面的代码相同:

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

两个方法在对象上调用相同的东西,但我想第一个方法会随着时间的推移更快,因为调用站点是缓存的。仅当您因某种原因无法使用dynamic时,才使用第二个。

相关内容

  • 没有找到相关文章

最新更新