如何访问动态类型的字段

本文关键字:动态 类型 字段 访问 何访问 | 更新日期: 2023-09-27 18:35:08

我正在尝试将查询结果包装为 LINQ 检索的dynamic对象列表中名为 QueryResultViewModel 的类。它们包含一个名为 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) });
    }

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

如何访问动态类型的字段

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

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

我假设Execute的签名类似于object Execute()。如果您返回dynamic,它应该可以工作。