Accediendo a las propiedades de una clase de forma dinámica
Es probable que esto no suponga niguna novedad, pero de todas formas, vamos allá:
Actualmente estoy trabajando en una clase para serializar y deserializar otras clases. Por ejemplo, la siguiente:
class net.designnation.tests.Serializable
{
private var prop1: String;
private var prop2: Number;
private var prop3: Object;
private var unseen: String;
public static var CONSTANT: String = "Esto es una constante";
function Serializable( )
{
this.unseen = "Hola, mundo!";
}
public function set val1( param: String )
{
this.prop1 = param + " <:::::::: setter ";
}
public function get val1( ): String
{
return this.prop1 + " <:::::::: getter ";;
}
public function set val2( param: Number )
{
this.prop2 = param + 100;
}
public function get val2( ): Number
{
return this.prop2 + 10000;
}
public function set val3( param: Object )
{
this.prop3 = param;
}
public function get val3( ): Object
{
return this.prop3;
}
}
Para leer sus propiedades, podemos hacer lo siguiente:
import net.designnation.tests.*
import net.designnation.utils.*
var myClass: Serializable = new Serializable( );
myClass.val1 = "Hi!";
myClass.val2 = 32;
myClass.val3 = { prop: "value" };
trace(" ------------------------\n ");
for ( var k in myClass )
{
trace( k + " == " + myClass[ k ] );
}
//setting
for ( var k in myClass )
{
if ( k == "prop1" ) myClass[ k ] = "modificado";
if ( k == "unseen" ) myClass[ k ] = "unseen, modificado";
}
//checking
trace(" \n------------------------\n ");
for ( var k in myClass )
{
trace( k + " == " + myClass[ k ] );
}
Pero, qué ocurre cuando queremos acceder a esas propiedades a través de sus getters / setters?. Pues que no lo podemos hacer, ya que no aparecen en el bucle for .. in
Pero, utilizando ASSetPropFlags, se pueden mostrar todas las propiedades y métodos de myClass.__proto__, es decir, de la clase a partir de la cual se instancia ese objeto. Esto es muy peligroso, porque realmente no se sabe durante cuánto tiempo va a seguir existiendo ese método. Pero, para nuestro caso, es la forma de poder acceder a todos los métodos de la clase
class net.designnation.utils.showProps
{
static function showAll( obj )
{
_global.ASSetPropFlags( obj.__proto__, null, 0, 1 );
return obj;
}
}
De vuelta al script:
// Mostrando todas las propiedades
myClass = showProps.showAll( myClass );
trace(" \n------------------------\n ");
for (var k in myClass)
{
trace( k );
}
//Obeteniendo los valores a través de los getters
trace( " \n------------------------\n " );
trace( " Llamando a los getters \n" );
for (var k in myClass)
{
var prefix: String = k.substring( 0, 7 );
var posfix: String = k.substring( 7, k.length);
if ( prefix == "__get__" )
{
trace( myClass[ k ]( ) );
}
}
trace( " \n------------------------\n " );
trace( " seteando utilizando los setters \n" );
for (var k in myClass)
{
var prefix: String = k.substring( 0, 7 );
var posfix: String = k.substring( 7, k.length);
if ( prefix == "__set__" )
{
if ( posfix == "val1" ) myClass[ k ]( " the end " );
}
}
trace( myClass.val1 );
Resuelto. Peligroso, no muy limpio, pero puede sacar de algún apuro.