Доступ к внутреннему полю [WebClient] - PullRequest
0 голосов
/ 20 сентября 2010

У меня есть экземпляр 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)

Можно ли как-то прочитать это поле или просто не могу прочитать содержимое внутренних полей?

Ответы [ 2 ]

1 голос
/ 20 сентября 2010

Экземпляр неверен.

Вы не можете передать экземпляр типа WebClient, когда FieldInfo ожидает экземпляр DownloadBitsState.

0 голосов
/ 21 сентября 2010

Возможно, что вы хотите, чтобы поле только для записи.Используйте отражатель, чтобы посмотреть на источник, чтобы увидеть, что происходит.Если это только запись, вам нужно будет получить доступ к закрытому полю.

Также: он передает ссылку, используя m.GetValue (c), поскольку c является экземпляром отправителя, приведенного к Webclient.

Кстати: убедитесь, что WebClient не равен нулю.

- Правка. После публикации моего ответа я понимаю, что вы пытаетесь получить доступ к свойству типа, экземпляр которого не создан.Doh!Есть ли у Webclient свойство с экземпляром DownloadBitsState?Используйте это, ТО затем потяните свойство

- Редактировать: Глядя на код, единственный метод в веб-клиенте, который создает экземпляр 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;
}

Итак, вы не можетеделай что хочешь так, как хочешь.

...