在用Expression解析的的时候碰到一些参数(不是具体的值),会出现这种情况。

  

  在这里我们希望得到的是id=10,而不是id=m_id;那如何来解析这些参数?

====================================================================================================\

  首先参数分为2中,一种是n.id,这种可以说是一种形参,没有具体的数据只是泛型中的一个属性,这种应该被解析成字符串id,另外一种是m_id,这种是有具体的值得,我们希望它解析成具体的值(10)而不是m_id。在Expression的子类中的MemberExpression类接收。我们来看看MemberExpression的信息

  

  我们可以通过MemberExpression类的Expression 来确定参数的类型,判断这个参数是那种类型。

  

  public class StudentHelper
{
public int id1 { get; set; } //属性
public int id2; //字段
public static int id3 { get { return ; } } //静态属性
public static int id4 = ; //静态字段 }

一个数据类

   public static void Main(string[] args)
{
StudentHelper h = new StudentHelper();
h.id1 = ;
h.id2 = ;
Expression<Func<Student, bool>> la1 = n=> n.id == h.id1;
Expression<Func<Student, bool>> la2 = n=> n.id == h.id2;
Expression<Func<Student, bool>> la3 = n=> n.id == StudentHelper.id3;
Expression<Func<Student, bool>> la4 = n=> n.id == StudentHelper.id4;
Expression<Func<Student, bool>> la5 = n=> n.id == n.new_id;
test(la1,"属性");
test(la2, "字段");
test(la3, "静态属性");
test(la4, "静态字段");
test(la5, "自身参数");
Console.ReadLine();
}
public static void test(Expression<Func<Student, bool>> la,string name)
{
Console.WriteLine("\n\n*****************"+name+"*********************");
BinaryExpression B_exp = la.Body as BinaryExpression;
Console.WriteLine("Expression类名:"+B_exp.Right.GetType().Name);
MemberExpression m_exp = B_exp.Right as MemberExpression;
string valueClassName = string.Empty;
if (m_exp.Expression == null)
{
Console.WriteLine("数据为空");
}
else
{
valueClassName = m_exp.Expression.GetType().Name;
Console.WriteLine("数据Expression类名:" + valueClassName);
}
Console.WriteLine("\n\n*********************************************");
}

调试结果:

通过调试结果可以看到自身的参数其数据对象为类型TypedParameterExpression,不是有2中可能静态的字段和属性其数据对象为空,有则为FieldExpression类型。判断完后就可以把表达式当成委托编译出来。

具体代码如下:

 public static object Eval(MemberExpression member)
{
UnaryExpression cast = Expression.Convert(member, typeof(object));
object obj = Expression.Lambda<Func<object>>(cast).Compile().Invoke();
return obj;
}

最后把代码嵌入进入:

调试结果为

  

最新文章

  1. 【Swift】UILabel 设置内边距
  2. python 正则
  3. html5遵循的5个设计原则
  4. Java 应用性能调优实践
  5. 【现代程序设计】homework-10
  6. 感谢大家的支持,发布一个JWFD的补丁文件
  7. FormsAuthentication与Session超时时间不一的解决方法
  8. Android ListView快速定位(四)
  9. 03 将MDB文件在DATAGRID中显示
  10. BZOJ 3237([Ahoi2013]连通图-cdq图重构-连通性缩点)
  11. 【前端童鞋看过来!】给大家分享网盘里前端相关书籍,主要是和网络通信(HTTP/TCP/IP)及javascript相关的
  12. 十行代码分清Java 的 || 和 &amp;&amp;
  13. ASP.NET Core中如何针对一个使用HttpClient对象的类编写单元测试
  14. Golang 入门系列(四)如何理解interface接口
  15. POJ3094 Quicksum
  16. Mysql Router 的集群
  17. deepin 桌面突然卡死
  18. python logging配置时间或大小轮转
  19. js 高级知识点
  20. 安装vue CLI后, 出现安装权限问题

热门文章

  1. (转载) 清理缓存 IPackageStatsObserver
  2. C# 对象初始化器和集合初始化器
  3. STM8S103之中断优先级设置
  4. [HNOI2008]越狱 快速幂 逆推
  5. BZOJ 2141 排队(CDQ分治)
  6. 05004_Linux的其他命令和权限命令
  7. Google C++ Style Guide的哲学
  8. 洛谷——P3370 【模板】字符串哈希
  9. Hellow BeiJing
  10. 新手做2D手游该用哪些工具?