ColdFusion-将查询转换为CFC设置器

ColdFusion-将查询转换为CFC设置器,coldfusion,coldfusion-10,Coldfusion,Coldfusion 10,我正在将一个较旧的站点转换为CF 10,并希望提供一些帮助程序代码 代码查看查询,查找实例中的内容,并填充它们: <cffunction name="populateSelf"> <cfargument name="source" type="query" required="yes" /> <cfif arguments.source.recordcount EQ 1> <cfloop list="#arguments.

我正在将一个较旧的站点转换为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>
但这似乎很复杂,而且容易出错(也必须转义字符串中的任何“”)


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

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

<cfinvoke method="set#property#">


有道理吗

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

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

myMethodName = "set#local.col#";
myMethodReference = this[myMethodName];
myMethodReference(arguments.source[local.col]);

实际上是的,很好的电话。用函数引用来避免混乱。好的,我试过了,但是我无法让它接受要设置的参数,因为我不知道该参数的名称。(我试过了,但运气不好)……啊,好吧,我明白你的问题了。您的setter的参数名是否有命名约定,就像您的方法本身有命名约定一样?如果您这样做了,那么您可以在我前面提到的内容之外再使用cfinvokeargument。您不能简单地使用argumentcollection吗?或者我遗漏了什么(cc@baynezy)@AdamCameron你也可以使用argumentCollection。他面临的问题是,他不知道要传递到方法中的参数的名称。所以你的方法就是让他不受参数顺序的影响。是的!“我如何动态调用方法!”我想不出正确的动词来使用。。。呆头呆脑的假期,我的脑子都漏出来了。嘿,斯蒂芬@贝内兹的答案比我的好!你应该接受他的建议,而不是我的建议。
myMethodName = "set#local.col#";
myMethodReference = this[myMethodName];
myMethodReference(arguments.source[local.col]);