Не существует стандартного способа сделать это, однако вы можете решить его двумя различными способами.
Версия 1: метод конструктора
public class Person {
public function Person(raw:Object=null) {
if (raw != null) {
for ( var key:String in raw ) {
try {
this[key] = raw[key];
} catch (e:Error) {}
}
...
Это своего рода ошибка. Если свойство с именем key не существует, присваивание завершится ошибкой, а если тип не соответствует или не может быть принудительно приведен автоматически, то оно также завершится неудачей.
Версия 2: flash.utils.describeType ()
Гораздо сложнее, дает вам больше контроля. Сначала вы должны создать экземпляр Person и вызвать descriptionType ().
var o:Object = { ... } // raw person data
var p:Person = new Person();
var typeDesc:XML = flash.utils.describeType( p );
for (var key:String in o) {
var node:XML = typeDesc.variable.(@name==key)[0];
if ( node != null ) {
// Person class has a property *key*
p[key] = o[key];
}
}
Но будьте осторожны при использовании геттеров и сеттеров вместо публичных переменных. Вы не можете получить к ним доступ с помощью typeDesc.variable, вместо этого вы должны использовать typeDesc.accessor и проверить, не является ли его атрибут доступа доступным только для записи.
Относительно вашего типа ключа. Для динамической загрузки класса вы можете сделать:
var clazz:Class = flash.utils.getDefinitionByName(raw.type+"");
var person:Person = Person( new clazz() );
Конечно, raw.type может содержать Person или com.package.Person , пока целевой класс существует и компилируется с проектом или динамически загружается с помощью SWC.
Взгляните на:
http://livedocs.adobe.com/flex/3/langref/flash/utils/package.html#getDefinitionByName()
и http://livedocs.adobe.com/flex/3/langref/flash/utils/package.html#describeType()
Надеюсь, это поможет:)