我正在使用.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(...)
}
我的问题是,如何在匿名类型中访问“标题”值?我假设我需要使用反射,但到目前为止,我没有好运。
答案 0 :(得分:4)
如果您使用的是C#4.0:
dynamic o = e.UserState;
o.title;
你可以使用反射,但它会变大,变慢和变丑。命名类型会更明智。
答案 1 :(得分:3)
不要使用匿名对象。它们仅限于当前方法。一旦离开定义它们的当前方法的范围,访问它们就变成了PITA。因此,定义一个简单的类,然后转换为这个类:
BackgroundProcess.ReportProgress(100, new MyClass { Title = "complete" });
然后:
private void myEventHandler(object sender, RunWorkerCompletedEventArgs e)
{
var title = ((MyClass)e.UserState).Title;
}
答案 2 :(得分:1)
你不能也没有理由不创建一个传递值的类。
可能性投向dynamic
,然后获取该属性,但我不建议。