Если вам не нужно полностью универсальное решение (сколько классов вы собираетесь сравнить?), Напишите пользовательскую функцию compare
в соответствующем классе, которая проходит через свойства класса и возвращает логическое значение.
Обновление:
Спасибо Дэн за describeType
. Осторожно, чтобы описать descriptionType, он отражает только открытые переменные / свойства класса. Приватный / защищенный / внутренний материал не включен в выходные данные descriptionType. Следовательно, если вы используете его для сравнения двух объектов, имеющих одинаковые общие свойства, но разные частные свойства, он все равно скажет вам, что они равны.
Вот класс AS и его вывод descriptionType.
Data.as
package
{
public class Data
{
private var privateVar:Boolean;
protected var protectedVar:Boolean;
internal var internalVar:Boolean;
var noModifierVar:Boolean;
public var publicVar:Boolean;
public function set writeOnlyProp(value:Boolean):void
{
}
public function get readOnlyProp():Boolean
{
return true;
}
public function set readWriteProp(value:Boolean):void
{
}
public function get readWriteProp():Boolean
{
return false;
}
public function Data(pub:Boolean = false, priv:Boolean = false,
prot:Boolean = false, inter:Boolean = false)
{
this.privateVar = priv;
this.protectedVar = prot;
this.internalVar = inter;
this.publicVar = pub;
}
}
}
Вывод describeType
: обратите внимание, что здесь перечислены только публичные переменные.
<type name="Data" base="Object" isDynamic="false" isFinal="false" isStatic="false">
<extendsClass type="Object"/>
<constructor>
<parameter index="1" type="Boolean" optional="true"/>
<parameter index="2" type="Boolean" optional="true"/>
<parameter index="3" type="Boolean" optional="true"/>
<parameter index="4" type="Boolean" optional="true"/>
</constructor>
<accessor name="readOnlyProp" access="readonly" type="Boolean" declaredBy="Data"/>
<variable name="publicVar" type="Boolean"/>
<accessor name="readWriteProp" access="readwrite" type="Boolean" declaredBy="Data"/>
<accessor name="writeOnlyProp" access="writeonly" type="Boolean" declaredBy="Data"/>
</type>
Общий код сравнения будет выглядеть так:
public static function compareObjects(a:Object, b:Object):Boolean
{
var description:XML = describeType(a);
var bDescription:XML = describeType(b);
//different classes
if(description.toXMLString() != bDescription.toXMLString())
return false;
if(String(description.@isDynamic) == "true")
{
var t:*;
for(t in a)
if(a[t] != b[t])
return false;
//Just in case b has a dynamic property that a doesn't
for(t in b)
if(a[t] != b[t])
return false;
}
var properties:Array = [];
//readonly and readwrite properties
var accessors:XMLList = description.accessor.(@access != "writeonly");
var type:XML;
for each(type in accessors)
properties.push(String(type.@name));
//other variables
var variables:XMLList = description.variable;
for each(type in variables)
properties.push(String(type.@name));
for each(var prop:String in properties)
{
if(a[prop] != b[prop])
return false;
}
return true;
}
PS: После написания всего этого кода я все еще чувствую, что написание собственного кода в соответствующем классе - правильный путь, так как это не учитывает личные / защищенные данные.