如何访问动态类型的字段?

时间:2012-05-23 10:32:02

标签: c# linq dynamic

我正在尝试使用LINQ检索的QueryResultViewModel对象列表中的一个名为dynamic的类来包装查询结果。它们包含一个名为Worked的整数字段。我不应该使用非动态类型,因为根据查询它有其他字段。我试过了:

    var query = new HoursQuery( .. parameters .. );
    this.Result = new ObservableCollection<QueryResultViewModel>(
      query.Execute().Select( x => new QueryResultViewModel( x.Worked )));

但我得到“'对象'不包含'工作'的定义”,我不知道如果可以修改它而不更改查询的返回类型。

执行代码也可能有用:

    var res = some_list.GroupBy(a => new { a.Employee, a.RelatedTask, a.Start.Month })
       .Select(g => new { K = g.Key, Worked = g.Sum(s => s.Duration.TotalHours) });

编辑:这很有效,但也许不是很优雅。

    public class HQueryDTO
    {
        public double Worked;
        public object K;
    }

    public IEnumerable<dynamic> Execute()
    {
        var list = base.Execute();
        return res = list.GroupBy(a => new { a.Employee, a.RelatedTask } )
          .Select(g => new HQueryDTO { K = g.Key, Worked = g.Sum(s => s.Duration.TotalHours) });
    }

现在结果有一个类型,它可以动态返回。

2 个答案:

答案 0 :(得分:1)

假设你在编译时遇到错误,在这种情况下只需通过强制转换引入dynamic

.Select(x => new QueryResultViewModel( ((dynamic)x).Worked ))

答案 1 :(得分:0)

我认为Execute的签名类似object Execute()。如果您返回dynamic,它应该有效。