2009-05-18 13 views
6

Actualización: Basándome en las respuestas, al principio seguí la ruta del uso de IsInstanceOf() que fue diseñado para esta necesidad. Sin embargo, resultó ser extremadamente ineficiente por alguna razón desconocida. Al depurar la aplicación más tarde, terminé simplemente configurando algunas propiedades en el objeto para usar en lugar de IsInstanceOf, lo que dio como resultado una mejora en la velocidad de órdenes de magnitud.¿Es posible probar un objeto contra un tipo de componente y/o tipo heredado?

Lo que estoy tratando de hacer es probar un objeto en ColdFusion para ver qué tipo de componente es. Algo así como ...

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

pensé que esto era posible, pero recibe un error que indica el tipo que estoy pasando no corresponde a uno en la lista válida de tipos ...

argumentos de tipo válidos son: any, array, Boolean, date, numérico, query, string, struct, UUID, GUID, binary, integer, float, eurodate, time, creditcard, email, ssn, telephone, zipcode, url, regex, range, component, o variableName.

¿Hay alguna manera de lograr esto en ColdFusion?

+1

Creo que donde dice el documento, "componente" en esa lista, puede literalmente ingresar "componente" y evaluará si la variable es o no un componente. Para verificar si se trata de una clase de componente específica, use el ejemplo de Sam Farmer a continuación. –

Respuesta

7

También podría usar IsInstanceOf(). Aunque todavía debe usar la ruta completa, también se puede usar para determinar la herencia o identificar componentes que implementan una interfaz en particular.

<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

¡Gracias! Esto es exactamente lo que estoy buscando. De hecho, le permite usar una ruta de componente relativa para la comparación de tipos, que es lo que yo quería. –

8

Puede usar GetMetaData para encontrar el tipo. Un código rápido:

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

Parece que GetMetaData puede contener la solución. La propiedad "tipo" solo dice "componente", pero hay otras propiedades que sí tienen la ruta de herencia completa, como "nombre" y "nombre completo". Sin embargo, pensé que había una manera de probar los tipos relativos en lugar de los caminos completos. Sin embargo, puedo estar recordando incorrectamente. –

3

puede usar nombre o nombre completo de la función getmetadata().

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

o

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

documentos están aquí getmetadata() en lo getMetaData() devuelve dependiendo del tipo de objeto.

0

Dan, no dude en rasgar el código de MXUnit que hace exactamente lo que tiene que hacer. Lo hacemos en nuestra aserción assertIsTypeOf(). Consulte aquí para obtener más detalles: http://code.google.com/p/mxunit/source/browse/mxunit/trunk/framework/MXUnitAssertionExtensions.cfc

La razón por la que ve el rendimiento alcanzado con isInstanceOf() probablemente tenga que ver con establecer this.customTagPaths en su Application.cfc. Golpeé esto yo mismo y archivé un error recientemente. Esperemos que se arregle en CF10, cuando sea eso.

Cuestiones relacionadas