DynamicExpression.Parse在何种程度上识别C#符号?

时间:2018-09-07 15:35:20

标签: c# dynamic

给出一个字符串:“ 5.2m * 5.7m” 返回类型为Decimal; 并致电

Set objconn = New ADODB.Connection
Set objrs = New ADODB.RecordSet

objconn.Open ConnStr

strsql = "DECLARE @Num tinyint " & _
    "SELECT @Num=Number from FNOLTracker.HandlerList WHERE Name='Joe Bloggs' " & _
    "IF @Num IS NULL " & _
    "BEGIN " & _
    "SELECT 'Not There' AS Result " & _
    "END " & _
    "ELSE " & _
    "BEGIN " & _
    "SELECT 'There' AS Result " & _
    "END"

 With objrs
    .Open strsql, objconn, adOpenStatic, adLockReadOnly, adCmdText
    MsgBox .Fields(0)
End With

将给出关于位置上的字符'm'的语法错误; 经过一番测试,同样适用于“ d”; 为了提供一些背景信息,使用m的原因是为了避免另一个错误,即double * decimal的乘法,因为它将默认将浮点值解释为double。

我的问题是:为什么会这样?解决双十进制问题的最佳方案是什么?通过(decimal)5.7强制转换的值我知道是十进制或使用Convert.ToDecimal(5.7)?parse()到底知道多少?(我没有找到有关msdn的文档)

1 个答案:

答案 0 :(得分:0)

  

我的问题是:为什么会这样?

发生这种情况是因为DynamicExpression使用了自定义的表达式解析器。它类似于C#,但不是C#。并非在C#中有效的所有内容都可以正常工作,并且在C#中有效的某些内容也可以不同地工作。

  

什么是解决double * decimal问题的最佳方案?通过(decimal)5.7强制转换的值我知道是十进制还是使用Convert.ToDecimal(5.7)?

发布,但不使用此语法。使用的语法是type(expr),而不是(type)expr,请参见下文。

  

parse()到底知道多少?(我没有找到有关msdn等的文档)

http://ak-dynamic-linq.azurewebsites.net/GettingStarted上提供了原始文档的副本。我尚未验证整个文档是否未修改,但已将以下内容与原始文档进行了比较。

引用:

  

表达式语言允许使用语法type(expr)type"string"进行显式转换,其中 type 是类型名称,可以选择后跟? expr 是表达式,或者 string 是字符串文字。此语法可用于执行以下转换:

     
      
  • 提供的两种Type.IsAssignableFrom之间在一个或两个方向上都是正确的。
  •   
  • 提供两种或两种接口类型之间的接口类型。
  •   
  • 在任何值类型的可为空和不可为空的形式之间。
  •   
  • 字符串和具有静态TryParse方法的任何类型之间。
  •   
  • 属于SByteByteInt16UInt16Int32UInt32,{ {1}},Int64UInt64DecimalSingleDouble,任何 enum 类型,以及这些类型的 nullable 形式。
  •