2016-08-26 111 views
2

我想要获取WPF WebBrowser对象的私有属性的值。我可以在调试器中看到它有一个非空值。PropertyInfo.GetProperty返回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... 

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

+2

你确定'activeX'是'null'吗?它不会给我null。 –

+0

谢谢你试试看。不幸的是,它确实给了我一个空值。这是完整的项目,如果你想检查:https://github.com/zskolbay/WpfBrowserTest – Bedford

+0

我在github上测试了你的代码,'activeX'不为null。只有下一行引发异常。 –

回答

2

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

使用dynamic

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

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

只是反射

一个小小的改变你的代码不一样上面的代码:

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

两种方法调用对象的同样的事情,但我想第一个是由于呼叫站点的高速缓存,随着时间的推移会更快。只有在出于某种原因不能使用dynamic的情况下才使用第二个。

相关问题