“对象”类型中不存在属性或字段“x” - 动态linq

时间:2014-02-03 16:08:32

标签: c#

我有一个具有Object类型属性的类。

class Test
{
    public Object obj { get; set; } // This "obj" can be of type Test1 or other type 
    .....
}

class Test1
{
    public int a = 1;
    public int b = 2;
}

List<Test> myList = new List<Test>{new Test() {obj = new Test1()}} // This contains some values.

现在我想基于“obj”值对“myList”进行排序,并使用以下方式动态识别排序字符串:

myList.AsQueryable().OrderBy("obj.a ascending, obj.b descending");

这是我收到错误的时候。我尝试了类型转换,但这没有帮助。

4 个答案:

答案 0 :(得分:1)

在LINQ中排序的方法是:

var sortedList = myList.OrderBy(obj => obj.a).ThenByDescending(obj => obj.b).ToList();

如果问题标题中的“动态”是指在运行时构建您的条件,也许您应该查看Dynamic LINQ

答案 1 :(得分:1)

我有类似的错误,但在我的情况下,我只有一个对象列表(List),我不得不动态排序。我使用activator创建了一个对象类型的IList实例,添加了所有对象,然后动态地对它进行了排序。

答案 2 :(得分:0)

编译器不知道obj是什么,因为它的类型为Object

解决此问题的唯一方法是在您的类型上实现一个具有公共ab或使用dynamic而不是Object的界面。但是,除非绝对必要,否则使用dynamic并不是解决这些问题的最佳方式。

答案 3 :(得分:0)

第一件事是myList期望Test类型的对象不是Test1。您需要像{/ p>这样设置obj Test属性的值

List<Test> myList = new List<Test>{new Test(){ obj=new Test1() }};

现在您要对Test1对象应用排序,因此您需要将该对象转换为Test1类型,然后应用排序。

myList.OrderBy(x => ((Test1)x.obj).a).OrderByDescending(x => ((Test1)x.obj).b);