You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:49:28