【问题标题】:Attached an anonymous type to an object; how to retrieve it?将匿名类型附加到对象;如何找回它?
【发布时间】:2011-05-11 22:05:09
【问题描述】:

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

我的问题是,如何访问匿名类型中的“title”值?我认为我需要使用反射,但到目前为止我运气不佳。

【问题讨论】:

  • 我知道必须定义愚蠢的一次性类型很烦人,但到目前为止,最惯用和最干净的解决方案就是在这里定义一个带有标题属性的命名类型。为什么要费心反思?
  • 但是如果你只需要标题,为什么还要定义一个对象呢?只需传递一个字符串并将其转换为事件处理程序中的字符串。
  • 你的问题是完全有效的,但在这一点上,这对我来说是一个学术问题——我一直在努力让它与反思一起工作,每次我认为我有它时,我没有.

标签: c# reflection anonymous-types


【解决方案1】:

如果您使用的是 C# 4.0:

dynamic o = e.UserState;
o.title;

可以使用反射,但它会很大、很慢而且很丑。命名类型会更明智。

【讨论】:

    【解决方案2】:

    不要使用匿名对象。它们仅适用于当前方法。一旦离开定义它们的当前方法的范围,访问它们就变成了 PITA。所以定义一个简单的类,然后强制转换为这个类:

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

    然后:

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

    【讨论】:

    • 谢谢——我明白你所说的 PITA 部分的意思了。
    【解决方案3】:

    你不能也没有理由不创建一个类来传递值。

    有可能正在转换为dynamic,然后获得该属性,但我不推荐它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-07
      • 1970-01-01
      相关资源
      最近更新 更多