本菜鸟在啃表达式树,想到一个以前遇到的问题,就是根据所给的字段,对集合进行动态排序。
现在我想用表达式树来解决这个问题,遇到一点小问题,希望各位大神不吝赐教。
ParameterExpression parameterExpression = Expression.Parameter(typeof(T), "a"); MemberExpression memberExpression = Expression.PropertyOrField(parameterExpression, orderField); Expression<Func<T, int>> expression = Expression.Lambda<Func<T, int>>(memberExpression, parameterExpression); Func<T, int> func = expression.Compile(); if (orderFunc == "asc") { return list.OrderBy(func); } else { return list.OrderByDescending(func); }
这是我写的代码,可以看到
Expression<Func<T, int>>
这里的Func第二个参数我写成了int,这样我如果根据int型的字段去排序是没有问题,但是如果我想根据DateTime类型的字段去排序就不行了,需要把int改成DateTime。
我天真的以为只要这么写就可以了:
Expression<Func<T, Object>>
可惜不行,会报一个异常出来:类型为“System.DateTime”的表达式不能用于返回类型“System.Object”。
有什么办法可以优雅(我可以想到的办法就是 用反射获得这个字段是什么类型的,然后 根据不同的类型 去创建不同 的Expression,
这样就需要写一堆 case,但是这样有点傻 )的解决这个问题呢?
MethodCallExpression methodCallExpression = Expression.Call(memberExpression, typeof(Object).GetMethod("ToString", new Type[] { }));