请问怎么将一个字符串转成lambda表达式 有一个字符串"p=>p.id==1"怎么把它转成(p=>p.id==1)表达式使它能够用在下面First参数里?mObjectContext.table1.First(p => p.id == 1).spec = "TEST"; 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这涉及到动态编译吧。目前.net 3.5类库只支持到c#2.0但是vs2010支持C#4.0,耐心等待吧 动态编译,动态查询都不支持。还有其它的办法吗?感觉目前的.NET太不成熟了。 这个问题分2个步骤,第一个步骤是把C#语法解析成CodeDOM的表达式,第二个步骤是把CodeDOM的表达式转成lambda表达式。第一个步骤目前微软没有提供任何C#语法解析工具,只有个编译成IL的编译器,所以需要自己写一个能解析C#3.0语法的解析器来解析新的lambda表达式。至于第二个步骤就很简单了,如果有了Code表达式那转换成lambda表达式就是体力活了。至于你这个例子,给个简单的转换lambda表达式的示例://p=>p==1; 假设p的类型为TParameterExpression param = Expression.Parameter(typeof(T), "p");LambdaExpression lamda = Expression.Lambda(Expression.Equal(Expression.Field(param, "id"), Expression.Constant(1)), param);mObjectContext.table1.First((Func<int, bool>)lamda.Compile()).spec = "TEST";对这种很简单的动态lambda,第一步可以不需要做一个完整的parser,做个简单的词法及表达式字符串解析工具就行了。 mObjectContext.table1.First((Func <int, bool>)lamda.Compile()).spec = "TEST"; 编译通不过,提示错误:错误 8 无法从用法中推导出方法“System.Linq.Queryable.First<TSource>(System.Linq.IQueryable<TSource>, System.Linq.Expressions.Expression<System.Func<TSource,bool>>)”的类型实参。请尝试显式指定类型实参。 这个目前是不可能的到c#4估计就可以了提前安装vs2010吧 mObjectContext.table1.First((Func <int, bool>)lamda.Compile()).spec = "TEST"; 这里手误,应该是mObjectContext.table1.First((Func <T, bool>)lamda.Compile()).spec = "TEST"; To:guoyichao 这样还是必须Func<T,bool>输入T这个类型,而不能用字符串替代 To:ojlovecd 周未研究出来了告诉我一下 我觉得,你不一定要把字符串转成lambda表达式,传入First里面的其实应该是一个委托,试试传入这个东西:new Fun<p的类型,bool>(p => p.id == 1) To:ojlovecd 因为只知道它的类型名称(字符串)就是p的类型只知道它的类型名称(字符串)new Fun <p的类型,bool>(p => p.id == 1)不知道怎么将字符串转成类型 为了能使用Queryable的那些强类型扩展方法,在编译时类型必须是要明确的,如果真要让查询支持动态类型,那就自己给Queryable写一套弱类型的扩展方法。 智能设备打包CAB项目安装后exe点击没反应 dataGridview 运行的时候,有时出现红叉叉 好心人帮帮忙,调了好久没调出来。 事务问题,如何在事务中更新数据后读取数据 急,传参问题 如何得到一个类实例的名字? 如何得到comboBox控件(绑定了数据源的)选定项的值?(WinForm) 如何判断日期类型数据为空?急,谢谢 VS2005串口通讯问题 我的webservice,是关于找工作的,主要负责对数据库的查询和更新,考虑到可能有多个client同时使用,我是否应该使用transaction? 如何检查一个xml文件是否合格? 父窗体如何触发子窗体的事件?
但是vs2010支持C#4.0,耐心等待吧
第一个步骤目前微软没有提供任何C#语法解析工具,只有个编译成IL的编译器,所以需要自己写一个能解析C#3.0语法的解析器来解析新的lambda表达式。
至于第二个步骤就很简单了,如果有了Code表达式那转换成lambda表达式就是体力活了。
至于你这个例子,给个简单的转换lambda表达式的示例://p=>p==1; 假设p的类型为T
ParameterExpression param = Expression.Parameter(typeof(T), "p");
LambdaExpression lamda = Expression.Lambda(Expression.Equal(Expression.Field(param, "id"), Expression.Constant(1)), param);
mObjectContext.table1.First((Func<int, bool>)lamda.Compile()).spec = "TEST";对这种很简单的动态lambda,第一步可以不需要做一个完整的parser,做个简单的词法及表达式字符串解析工具就行了。
错误 8 无法从用法中推导出方法“System.Linq.Queryable.First<TSource>(System.Linq.IQueryable<TSource>, System.Linq.Expressions.Expression<System.Func<TSource,bool>>)”的类型实参。请尝试显式指定类型实参。
到c#4估计就可以了
提前安装vs2010吧
这样还是必须Func<T,bool>输入T这个类型,而不能用字符串替代
周未研究出来了告诉我一下
传入First里面的其实应该是一个委托,试试传入这个东西:
new Fun<p的类型,bool>(p => p.id == 1)
因为只知道它的类型名称(字符串)
就是p的类型只知道它的类型名称(字符串)
new Fun <p的类型,bool>(p => p.id == 1)
不知道怎么将字符串转成类型
为了能使用Queryable的那些强类型扩展方法,在编译时类型必须是要明确的,如果真要让查询支持动态类型,那就自己给Queryable写一套弱类型的扩展方法。