2011-05-11 61 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,然后让我不建议这样做的属性,但