首页新闻找找看学习计划

表达式树的疑问

0
[已解决问题] 解决于 2016-09-29 12:15

本菜鸟在啃表达式树,想到一个以前遇到的问题,就是根据所给的字段,对集合进行动态排序。

现在我想用表达式树来解决这个问题,遇到一点小问题,希望各位大神不吝赐教。

复制代码
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,但是这样有点傻 )的解决这个问题呢?

CodeBear的主页 CodeBear | 初学一级 | 园豆:3
提问于:2016-09-29 11:22
< >
分享
最佳答案
0
  MethodCallExpression methodCallExpression = Expression.Call(memberExpression, 
                typeof(Object).GetMethod("ToString", new Type[] { }));

 

CodeBear | 初学一级 |园豆:3 | 2016-09-29 12:15
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册