OpenEdge中如何获取DYNAMIC-PROPERTY返回值的数据类型?
刚好碰到过类似的需求,在OpenEdge里要实现你想要的类型判断和格式化,其实有几个很实用的方法,我给你拆解一下:
方法1:用TYPE-OF()判断返回值的实际类型
TYPE-OF()函数可以直接返回对象的类型名称,不管是基本数据类型还是自定义类,完全匹配你“运行时判断类型”的需求。结合你的场景,代码可以这么写:
DEF INPUT PARAM oInvoice AS Invoice NO-UNDO. DEF VAR theValue AS Progress.Lang.Object NO-UNDO. DEF VAR formattedResult AS CHAR NO-UNDO. // 获取指定属性的值 theValue = DYNAMIC-PROPERTY(oInvoice, "Amount"). // 判断值的类型并格式化 CASE TYPE-OF(theValue): WHEN "DECIMAL" THEN formattedResult = STRING(theValue, ">>>>>9.99"). WHEN "CHAR" THEN formattedResult = TRIM(theValue). // 处理自定义类类型(注意要用CLASS关键字引用类) WHEN CLASS Customer THEN formattedResult = DYNAMIC-PROPERTY(theValue, "Name"). OTHERWISE formattedResult = STRING(theValue). // 默认处理其他未覆盖的类型 END CASE. RETURN formattedResult.
如果你的自定义类有包名,记得在CLASS后面加上完整路径,比如CLASS com.mycompany.Customer。
方法2:用INSTANCE OF判断自定义类实例
如果只需要快速判断某个值是否是特定自定义类的实例,INSTANCE OF会更直观,尤其适合处理嵌套属性的场景:
theValue = DYNAMIC-PROPERTY(oInvoice, "Customer"). // 直接判断是否为Customer类的实例 IF theValue INSTANCE OF Customer THEN formattedResult = DYNAMIC-PROPERTY(theValue, "Name").
这种写法在多层嵌套属性处理时,代码可读性会更高。
方法3:提前获取属性类型(DYNAMIC-PROPERTY-TYPE())
如果你想在获取值之前就知道属性的定义类型,可以用DYNAMIC-PROPERTY-TYPE()函数,它直接返回属性声明时的类型名称,这样可以提前做更精准的逻辑处理:
DEF VAR propType AS CHAR NO-UNDO. propType = DYNAMIC-PROPERTY-TYPE(oInvoice, "Amount"). CASE propType: WHEN "DECIMAL" THEN DO: DEF VAR amountVal AS DECIMAL NO-UNDO. amountVal = DYNAMIC-PROPERTY(oInvoice, "Amount"). formattedResult = STRING(amountVal, ">>>>>9.99"). END. WHEN "CHAR" THEN DO: formattedResult = TRIM(DYNAMIC-PROPERTY(oInvoice, "Email")). END. WHEN "Customer" THEN DO: DEF VAR custObj AS Customer NO-UNDO. custObj = DYNAMIC-PROPERTY(oInvoice, "Customer"). formattedResult = custObj:Name. // 这里甚至可以直接用静态属性访问 END. END CASE.
这种方式的好处是可以提前声明对应类型的变量,避免Progress.Lang.Object的类型转换,代码执行效率和可读性都更好。
处理嵌套属性的通用递归逻辑
如果需要处理多层嵌套的属性(比如Invoice -> Customer -> Name),可以写一个通用递归函数来自动处理:
FUNCTION GetFormattedValue RETURNS CHAR ( INPUT obj AS Progress.Lang.Object, INPUT propName AS CHAR ): DEF VAR valueObj AS Progress.Lang.Object NO-UNDO. valueObj = DYNAMIC-PROPERTY(obj, propName). IF valueObj = ? THEN RETURN "". CASE TYPE-OF(valueObj): WHEN "DECIMAL" THEN RETURN STRING(valueObj, ">>>>>9.99"). WHEN "CHAR" THEN RETURN TRIM(valueObj). WHEN CLASS Customer THEN RETURN GetFormattedValue(valueObj, "Name"). // 可以继续添加其他自定义类的处理逻辑 OTHERWISE RETURN STRING(valueObj). END CASE. END FUNCTION. // 调用示例 DEF VAR inv AS Invoice NO-UNDO. // 初始化inv的属性... MESSAGE GetFormattedValue(inv, "Amount") VIEW-AS ALERT-BOX. MESSAGE GetFormattedValue(inv, "Customer") VIEW-AS ALERT-BOX.
这样不管属性是基本类型还是自定义类,都能自动处理,后续扩展新的类类型也很方便。
内容的提问来源于stack exchange,提问作者Johan Vergeer
相关产品推荐
相关产品推荐

