数据类型:从XPath/XQuery到.NET
当在XPath/XQuery表达式中调用.NET扩展函数时,函数参数的数据类型是很重要的,用来确定调用同名的多个.NET方法中的哪一个。
在.NET中,需遵循以下规则:
•如果在一个类中有多个同名的方法,则将选择那些有与函数调用相同的参数数量的方法。
•XPath/XQuery的字符串、数字和布尔值数据类型(参见下方列表)会被隐式地转换为相应的.NET数据类型。如果所提供的XPath/XQuery类型可以被转换为不只一个.NET类型(例如,xs:integer),则将选择被调用的方法中声明的.NET类型。例如,如果被调用的.NET方法是fx(double),并且提供的XPath/XQuery数据类型是xs:integer,则xs:integer将被转换为.NET的double数据类型。
下表列出了从XPath/XQuery的字符串、数字和布尔值类型到.NET数据类型的隐式转换。
xs:string | StringValue, string |
xs:boolean | BooleanValue, bool |
xs:integer | IntegerValue, decimal, long, integer, short, byte, double, float |
xs:float | FloatValue, float, double |
xs:double | DoubleValue, double |
xs:decimal | DecimalValue, decimal, double, float |
上方列出的XML Schema数据类型的子类型(同时在XPath和XQuery中使用)也将被转换为与子类型的祖先类型对应的.NET类型。
在某些情况下,可能无法根据提供的信息选择正确的.NET方法。以下面这种情况为例。
•提供的参数是一个xs:untypedAtomic,值为10,打算将其用于mymethod(float)方法。
•然而,在该类中还有一个方法,采用另一个数据类型的参数:mymethod(double)。
•由于这两个方法的名称是相同的,并且提供的类型(xs:untypedAtomic)可以被正确地转换为float或double,所以xs:untypedAtomic很有可能被转换为double,而不是float。
•因此,选中的方法并不是所需的方法,可能无法生成预期的结果。要解决这一问题,您可以使用另一个名称创建一个用户定义的方法并使用该方法。
上表中没有包含的类型(例如xs:date)将不会被转换,从而产生一个错误。