É possível testar um objeto contra um tipo de componente e / ou tipo herdado?
-
22-08-2019 - |
Pergunta
Update: Com base nas respostas que inicialmente foi a rota de usar IsInstanceOf (), que foi projetado para essa necessidade. No entanto, acabou por ser extremamente ineficiente por algum motivo desconhecido. Na depuração o aplicativo mais tarde I terminou apenas definir algumas propriedades no objeto para usar em vez de IsInstanceOf resultando em ordens de melhoria de velocidade magnitude.
O que estou tentando fazer é testar um objeto no ColdFusion para ver que tipo de componente que é. Algo como ...
<cfif isValid( "compath.dog", currentObj)>
...do something specific with dog objects...
</cfif>
Eu pensei que isso era possível, mas receber um erro dizendo que o tipo eu estou passando não corresponde a um na lista válida de tipos ...
argumentos de tipo válidos são: qualquer, array, booleano, data, numérico, consulta, corda, struct, UUID, GUID, binário, inteiro, float, eurodate, tempo, cartão de crédito, e-mail, CPF, telefone, CEP, url, regex, gama, componente ou variableName.
Existe uma maneira de fazer isso no ColdFusion?
Solução
Você também pode usar IsInstanceOf (). Embora você ainda deve usar o caminho completo, ele também pode ser usado para determinar herança ou identificar os componentes que implementam uma interface específica.
<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>
Outras dicas
Você pode usar GetMetadata para encontrar o tipo. Algum código rápida:
<cfif GetMetaData(currentObj).type eq "compath.dog">
Você pode usar o nome ou nome completo da função GetMetadata ().
<cfif GetMetaData(currentObj).name eq "compath.dog">
...do something specific with dog objects...
</cfif>
ou
<cfif GetMetaData(currentObj).fullname eq "compath.dog">
...do something specific with dog objects...
</cfif>
docs aqui GetMetadata () sobre o que GetMetadata () retorna, dependendo do tipo de objeto.
Dan, sinta-se livre para rasgar o código fora do MXUnit que faz exatamente o que você precisa fazer. Fazemo-lo em nossa assertIsTypeOf () afirmação. Veja aqui para mais detalhes: http: // código. google.com/p/mxunit/source/browse/mxunit/trunk/framework/MXUnitAssertionExtensions.cfc
A razão que você está vendo o desempenho atingido com isInstanceOf () provavelmente tem a ver com a criação this.customTagPaths em sua Application.cfc. Eu bati isso mesmo e entrou com um bug sobre ele recentemente. Esperemos que ele vai ficar fixo na CF10, sempre que é.