2009-05-18 77 views
6

更新:基于这个答案,我最初使用了为此需求设计的IsInstanceOf()的路线。然而,由于某些未知原因,结果却非常低效。在稍后调试应用程序时,我最终只设置了要使用的对象上的一些属性而不是IsInstanceOf,从而导致速度提高了几个数量级。是否可以根据组件类型和/或继承类型测试对象?

我想要做的是在ColdFusion中测试一个对象以查看它是什么类型的组件。喜欢的东西...

<cfif isValid("compath.dog", currentObj)> 
    ...do something specific with dog objects... 
</cfif> 

我认为这是可能的,但收到一个错误,说我传递的类型不符合一个在类型的有效列表...

有效的类型参数数组,查询,字符串,结构,UUID,GUID,二进制,整数,浮动,eurodate,时间,信用卡,电子邮件,ssn,电话,邮编,url,正则表达式,范围,组件,或variableName。

有没有办法在ColdFusion中实现这一点?

+1

我相信文档在该列表中说“组件”的地方,你可以从字面上输入“组件”,它会评估变量是否是组件。要检查它是否是特定的组件类,请使用下面的Sam Farmer示例。 – 2009-05-18 20:00:17

回答

7

您也可以使用IsInstanceOf()。虽然您仍然必须使用完整路径,但它也可用于确定继承或标识实现特定接口的组件。

<cfif IsInstanceOf(obj, "compath.Dog")> 
    yes. it is a dog component {woof} 
<cfelse> 
    some other type of component 
</cfif> 

<cfif IsInstanceOf(obj, "compath.AnimalInterface")> 
    yes. it implements the animal interface 
<cfelse> 
    no. it must be vegetable or mineral ... 
</cfif> 
+0

谢谢!这正是我正在寻找的。它实际上允许您使用相对组件路径进行类型比较,这正是我想要的。 – 2009-05-20 13:03:57

8

您可以使用GetMetaData来查找类型。一些快速代码:

<cfif GetMetaData(currentObj).type eq "compath.dog"> 
+0

它看起来像GetMetaData可能包含解决方案。 “type”属性只是说“组件”,但还有其他属性具有完整的继承路径,如“name”和“fullname”。但是,我认为有一种方法可以测试相对类型而不是完整路径。我可能只是记得不正确的。 – 2009-05-18 20:31:58

3

您可以使用getmetadata()函数中的名称或全名。

<cfif GetMetaData(currentObj).name eq "compath.dog"> 
    ...do something specific with dog objects... 
</cfif> 

<cfif GetMetaData(currentObj).fullname eq "compath.dog"> 
    ...do something specific with dog objects... 
</cfif> 

文档是什么的getMetaData这里getmetadata()()返回取决于对象类型。

0

丹,随意将代码从MXUnit中剥离出来,它完全符合您的需求。我们在assertIsTypeOf()断言中执行它。详情请看这里:http://code.google.com/p/mxunit/source/browse/mxunit/trunk/framework/MXUnitAssertionExtensions.cfc

你看到性能击中isInstanceOf()的原因很可能与你在Application.cfc中设置this.customTagPaths有关。我自己打了这个,并最近提出了一个错误。希望它能在CF10中得到修复,无论何时。