将匿名类型附加到对象;如何检索它?

时间:2011-05-11 22:05:09

标签: c# reflection anonymous-types

我正在使用.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(...)
}

我的问题是,如何在匿名类型中访问“标题”值?我假设我需要使用反射,但到目前为止,我没有好运。

3 个答案:

答案 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,然后获取该属性,但我不建议