【问题标题】:What is the difference between my codes when I use 'dynamic' to use AsQueryable method?当我使用“动态”来使用 AsQueryable 方法时,我的代码有什么区别?
【发布时间】:2015-05-07 15:51:23
【问题描述】:

一开始,我不使用dynamic,我只是使用这样的代码,它运行良好。

  List<Student> result2 = StudentRepository.GetStudent(sex,age).ToList();
  IQueryable rows2 = result2.AsQueryable();

但是当我把它改成dynamic,就错了。

 dynamic result = GetPeopleData(sex,age);
 IQueryable rows = result.AsQueryable();

我添加了一个这样的方法,我构建的项目显示 List 没有 AsQueryable 方法。如何更改它?

 private dynamic GetPeopleData(int sex, int age)
    {
        if(sex>30)
            return StudentRepository.GetStudent(sex,age).ToList();
        else
            return TeacherRepository.GetTeacher(sex, age).ToList();
    }

【问题讨论】:

  • 为什么要让它动态化?
  • 您正在显示GetPeopleData 方法,但您调用了GetStudentData。对吗?
  • 因为我只是想获取数据,不管它来自学生还是老师,我只想将它们更改为 IQueryable 行并导出这些行。
  • @aush,我已经改了。谢谢。

标签: c# c#-4.0 dynamictype


【解决方案1】:

AsQueryable() 是扩展方法,those don't work on dynamic

根据您想要做什么,有几种可能的解决方案:

  1. 不要使用dynamic。相反,让StudentTeacher 实现一个通用接口(比如IPerson)并使用它:

    private IReadOnlyList<IPerson> GetPeopleData(int sex, int age)
    {
        if (sex > 30)
            return StudentRepository.GetStudent(sex, age).ToList();
        else
            return TeacherRepository.GetTeacher(sex, age).ToList();
    }
    
    …
    
    var result = GetPeopleData(sex, age);
    IQueryable<IPerson> rows = result2.AsQueryable();
    
  2. 调用AsQueryable()作为一个普通的静态方法:

    dynamic result = GetPeopleData(sex, age);
    IQueryable rows = Queryable.AsQueryable(result);
    

顺便说一句,检查性别是否超过 30 岁对我来说没有任何意义。您可能应该重新考虑您设计的那部分。

【讨论】:

  • 这可能取决于sex 在这里的含义。我宁愿不询问更多细节。
  • @WiktorZychla 我能想到的唯一选择当然不能用来可靠地区分学生和老师。 :-)
【解决方案2】:

It is similar to this question.

正如@jbtule 所说,匿名类型是内部的,如果你跨越程序集边界动态无法解析属性。

尝试使用实际类型或 Expando 对象,而不是使用匿名类型。

【讨论】:

  • 我不相信这适用,因为 OP 没有显示任何匿名类型的使用......(假设 GetTeacher 返回 List&lt;Teacher&gt; 类似于另一个)。
猜你喜欢
  • 2018-06-17
  • 2015-08-28
  • 2021-08-14
  • 2016-08-26
  • 1970-01-01
  • 2014-07-03
  • 1970-01-01
  • 1970-01-01
  • 2019-06-12
相关资源
最近更新 更多