2009-05-18 116 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中得到修復,無論何時。