我有一个WebClient实例,它从远程网站接收数据。我引用了 DownloadProgressChanged 事件处理程序,我尝试访问 InnerBuffer ,这是 DownloadBitsState 中的内部字段 WebClient 中的嵌套类(设置为私有)。
我在DownloadProgressChanged事件处理程序中使用以下代码:
WebClient c = (WebClient)sender;
Type t = typeof(WebClient).GetNestedType("DownloadBitsState", BindingFlags.NonPublic);
FieldInfo m = t.GetField("InnerBuffer",BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly);
Debug.WriteLine(m.GetValue(c).ToString());
我收到运行时错误: FieldAccessException (System.Net.WebClient+DownloadBitsState.InnerBuffer
)
有什么方法可以阅读这个字段,或者我根本看不懂内部字段的内容?
答案 0 :(得分:1)
实例不正确。
当WebClient
期望FieldInfo
个实例时,您无法传递DownloadBitsState
类型的实例。
答案 1 :(得分:0)
您想要的字段可能是只写的。使用反射器查看源,看看发生了什么。如果它只是写入,那么您将需要访问私有字段。
另外:他使用m.GetValue(c)传入引用,因为c是发送者强制转换为Webclient的实例。
BTW:确保WebClient不为空。
- 编辑:在发布我的回答后,我意识到您正在尝试访问未实例化的类型的属性。卫生署! Webclient是否具有包含DownloadBitsState实例的属性?使用它,然后拉属性
- 编辑:查看代码,webclient中实例化DownloadBitsState的唯一方法是private byte[] DownloadBits()
private byte[] DownloadBits(WebRequest request, Stream writeStream, CompletionDelegate completionDelegate, AsyncOperation asyncOp)
{
WebResponse response = null;
DownloadBitsState state = new DownloadBitsState(request, writeStream, completionDelegate, asyncOp, this.m_Progress, this);
if (state.Async)
{
request.BeginGetResponse(new AsyncCallback(WebClient.DownloadBitsResponseCallback), state);
return null;
}
response = this.m_WebResponse = this.GetWebResponse(request);
int bytesRetrieved = state.SetResponse(response);
while (!state.RetrieveBytes(ref bytesRetrieved))
{
}
state.Close();
return state.InnerBuffer;
}
所以,你不能按照自己想要的方式做你想做的事。