6

我正在将一个旧站点转换为 CF 10,并希望提供一些我的帮助代码。

代码查看查询,找到我们实例中的内容并填充它们:

<cffunction name="populateSelf">
    <cfargument name="source" type="query" required="yes" />
    <cfif arguments.source.recordcount EQ 1>
        <cfloop list="#arguments.source.columnlist#" index="local.col">
            <cfif structKeyExists(variables.instance, local.col)>
                <cfset variables.instance[local.col] = arguments.source[local.col]) />
            </cfif>
        </cfloop>
    </cfif> <!--- one record? --->
</cffunction>

我已经structKeyExists(variables.instance, local.col)使用“getMetaData()”对我们当前的属性进行了方便的评估,但我在下一行遇到了问题:<cfset variables.instance[local.col] = arguments.source[local.col]) />

如果我将其更改为<cfset this[local.col] =arguments.source[local.col] />,它会忽略隐式设置器并将结果放在 this 范围内......

为了尝试调用我们的设置器,我尝试了这段代码:

<cfset setValue =arguments.source[local.col] />
<cfset evaluate("set#local.col#('#setValue#')" />

但这似乎很复杂且容易出错(也必须转义字符串中的任何“'”)。

使用查询加载部分或全部 CFC 属性而不必显式调用this.setPROPERTYNAME(query.COLUMN)可能几十次的最佳方法是什么????

4

2 回答 2

7

因此,如果我正确阅读了所有这些内容,那么您的问题实际上是“我如何动态调用方法?”,而其余所有内容都是定型的?

您可以使用字符串来设置动态变量名称,然后设置一个函数引用,然后通过引用调用该函数:

myMethodName = "set#local.col#";
myMethodReference = this[myMethodName];
myMethodReference(arguments.source[local.col]);
于 2013-01-01T10:32:20.790 回答
6

如果要动态调用方法,可以使用 cfinvoke

<cfinvoke method="set#property#">

有道理?

于 2013-01-01T10:31:18.380 回答