2011-05-11 50 views
2

我正在玩.NET的BackgroundWorker類。作爲其功能的一部分,您可以調用名爲ReportProgress的方法,該方法允許您傳入後臺任務已完成的百分比以及可選的用戶參數。將匿名類型附加到對象;如何檢索它?

最終ReportProgress調用一個事件處理程序,可選的用戶參數成爲事件參數的「UserState」成員。

這裏有一個快速的樣品的情況下,我沒有說清楚:

BackgroundProcess.ReportProgress(100, new{title="complete"}); 
/*****later on, this method is called******/ 
private void myEventHandler(object sender, RunWorkerCompletedEventArgs e) 
{ 
    //e.UserState is my anonymous type defined in the call to ReportProgress(...) 
} 

我的問題是,我怎麼能訪問我的匿名類型的「稱號」的價值?我假設我需要使用反射,但到目前爲止我沒有很好的運氣。

+2

我知道這很煩人,不得不定義愚蠢的一次性類型,但到目前爲止,最習慣和最乾淨的解決方案將是在這裏定義一個具有title屬性的命名類型。爲什麼要反思? – mquander 2011-05-11 22:08:04

+2

但是如果你只需要標題,爲什麼要定義一個對象呢?只需傳遞一個字符串並將其轉換爲事件處理函數中的字符串。 – 2011-05-11 22:36:03

+0

你的問題是完全有效的,但在這一點上對我來說這是一個學術問題 - 我一直在擺弄這樣的反思,每次我想我都有,但我沒有。 – larryq 2011-05-11 23:06:33

回答

4

如果您正在使用C#4.0:

dynamic o = e.UserState; 
o.title; 

可以使用反射,但它會很大,很慢很難看。一個命名類型會更明智。

3

請勿使用匿名對象。它們僅限於當前的方法。一旦你離開他們定義的當前方法的範圍,訪問他們就成爲PITA。所以定義一個簡單的類,然後轉換爲這個類:

BackgroundProcess.ReportProgress(100, new MyClass { Title = "complete" }); 

然後:

private void myEventHandler(object sender, RunWorkerCompletedEventArgs e) 
{ 
    var title = ((MyClass)e.UserState).Title; 
} 
+0

謝謝,我明白你的意思是PITA以我的方式嘗試它。 – larryq 2011-05-11 23:08:30

1

你不能也沒有理由不創建一個類來傳遞值。

在可能性被鑄造dynamic,然後讓我不建議這樣做的屬性,但