2009-05-18 21 views
6

Aktualizacja: Na podstawie udzielonych odpowiedzi początkowo podążałem drogą użycia IsInstanceOf(), która została zaprojektowana do tej potrzeby. Jednak okazało się to niezwykle nieefektywne z jakiegoś nieznanego powodu. Podczas debugowania aplikacji później skończyłem właśnie ustawiając pewne właściwości obiektu do użycia zamiast IsInstanceOf, co skutkowało zwiększeniem prędkości rzędu magnitud.Czy można przetestować obiekt na typie komponentu i/lub odziedziczonym typie?

Co próbuję zrobić, to przetestować obiekt w ColdFusion, aby zobaczyć, jaki jest jego typ. Coś jak ...

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

Myślałem, że to możliwe, ale pojawia się błąd mówiąc typ jestem przechodzącej nie odpowiada jeden w ważnej listy typów ...

Poprawne argumenty typu są: any, array, Boolean, date, numeric, query, string, struct, UUID, GUID, binary, integer, float, eurodate, time, creditcard, email, ssn, telephone, zipcode, url, regex, range, component, lub nazwa_zmiennej.

Czy można to osiągnąć w ColdFusion?

+1

Wierzę, że gdzie doktorzy mówią, "składnik" na tej liście, można dosłownie wpisać "składnik" i to będzie ocenić, czy zmienna jest składnikiem. Aby sprawdzić, czy jest to klasa konkretnego komponentu, skorzystaj z przykładu Sam Farmera poniżej. –

Odpowiedz

7

Można również użyć IsInstanceOf(). Chociaż nadal trzeba korzystać z pełnej ścieżki, można jej również użyć do określenia dziedziczenia lub zidentyfikowania komponentów implementujących dany interfejs.

<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

Dzięki! Właśnie tego szukam. W rzeczywistości umożliwia to użycie względnej ścieżki komponentu do porównywania typów, co jest tym, czego chciałem. –

8

Możesz użyć GetMetaData, aby znaleźć typ. Jakiś szybki kod:

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

Wygląda na to, że GetMetaData może zatrzymać rozwiązanie. Właściwość "type" po prostu mówi "component", ale istnieją inne właściwości, które mają pełną ścieżkę dziedziczenia, taką jak "name" i "fullname". Pomyślałem jednak, że istnieje sposób testowania względnych typów zamiast pełnych ścieżek. Może jednak pamiętam niepoprawnie. –

3

możesz użyć nazwy lub pełnej nazwy z funkcji getmetadata().

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

lub

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

docs tutaj getmetadata() na jakiej getmetadata() zwraca się w zależności od typu obiektu.

0

Dan, możesz zgrać kod z MXUnit, który robi dokładnie to, co musisz zrobić. Robimy to w naszym asercji assertIsTypeOf(). Szczegółowe informacje można znaleźć tutaj: http://code.google.com/p/mxunit/source/browse/mxunit/trunk/framework/MXUnitAssertionExtensions.cfc

Powód, dla którego widzisz wydajność z parametrem isInstanceOf() najprawdopodobniej ma związek z ustawieniem this.customTagPaths w pliku Application.cfc. Sam to trafiłem i ostatnio zgłosiłem do niego błąd. Mam nadzieję, że zostanie to naprawione w CF10, kiedykolwiek to nastąpi.

Powiązane problemy