2010-09-20 72 views
0

我有一個從遠程網站接收數據的WebClient實例。我引用的DownloadProgressChanged事件處理程序,我試圖訪問InnerBuffer,這是WebClient的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()); 

我得到一個運行時錯誤:FieldAccessExceptionSystem.Net.WebClient+DownloadBitsState.InnerBuffer

有什麼辦法,我可以讀取這個域或我根本無法讀取內部字段的內容?

回答

0

您想要的字段可能是隻寫的。使用反射器查看源代碼以查看發生了什麼。如果它只寫,那麼你將需要訪問私人領域。

另外:他傳遞參考使用m.GetValue(c)因爲c是發件人的實例轉換爲Webclient。

BTW:確保WebClient不爲空。

- 編輯:發佈我的答案後,我意識到你試圖訪問未實例化的類型的屬性。衛生署! Webclient是否有一個擁有DownloadBitsState實例的屬性?請使用,進而拉動財產

- 編輯:看代碼,在Web客戶端實例化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; 
} 

所以,你真的不能做你想要的是什麼你想要的方式。

+0

這已經在我的回答的評論中全部討論過了。此外,它現在看來,這是Windows Phone 7. – leppie 2010-09-21 18:12:54

+0

Ieppie,其中一些是,但我已經給了他一個'不'的確切答案,他不能這樣做,因爲如何使用DownloadBitsState。 – 2010-09-21 18:53:57

1

該實例不正確。

FieldInfo需要DownloadBitsState實例時,您無法傳遞WebClient類型的實例。

+0

我很好奇 - 我將如何傳遞實際的WebClient實例,而不是t - 這只是一種沒有實際數據的類型? – 2010-09-20 03:51:57

+0

即使我使用Debug.WriteLine(m.GetValue(c.GetType()。GetNestedType(「DownloadBitsState」,BindingFlags.NonPublic))。ToString()); - 它仍會拋出相同的異常。 – 2010-09-20 04:23:26

+0

@Dennis Delimarsky:那麼現在它是一個'Type'實例。你想做什麼? 「WebClient」中沒有看到「DownloadBitsState」的任何實例。 – leppie 2010-09-20 08:44:10