代码之家  ›  专栏  ›  技术社区  ›  Den

访问内部字段[WebClient]

  •  0
  • Den  · 技术社区  · 15 年前

    我有一个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

    有没有什么方法我可以读这个字段或者我根本无法读内部字段的内容?

    2 回复  |  直到 15 年前
        1
  •  0
  •   John Saunders    15 年前

    可能您想要的字段是只写的。用反射器观察光源,看看发生了什么。如果它是只写的,那么您需要访问私有字段。

    顺便说一句:确保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;
    }
    

    所以,你不能按你想的方式做你想做的事。

        2
  •  1
  •   leppie    15 年前

    实例不正确。

    你不能通过考试 WebClient FieldInfo 期望 DownloadBitsState

    推荐文章