2

さて、私はこの質問がいたるところにあるべきだと誓いますが、そうではありません。

私は値オブジェクトを持っています、中にはたくさんのゲッター/セッターがいます。動的クラスではありません。そして、私は必死にそれらで満たされたArrayCollectionを検索する必要があります。検索はすべてのフィールドにまたがるので、これを使用するVOには約13種類あります。

私はObjectUtil.toString()を試しましたが、それは問題なく機能しますが、地獄のように遅いです。返すプロパティは20あり、ObjectUtil.toString()は、コードが最初から遅いことは言うまでもなく、出力に大量のジャンクを追加します。

flash.utils.describeType()はさらに悪いです。

明らかな何かが欠けていると聞いてうれしく思います。

更新:最終的に、Juanのコードを、検索に使用するフィルターアルゴリズムと一緒に使用して、ArrayCollectionXを作成しました。つまり、私が使用するすべてのArrayCollectionは、独自のフィルターを処理するようになりました。AC内のアイテムの個々のプロパティを検索することも、Juanのコードを使用して、チャンピオンのように完全なコレクション検索を処理することもできます。外部フィルターを使用した同じソリューションと比較して、ごくわずかな遅延がありました。

4

1 に答える 1

3

私があなたの問題を正しく理解しているなら、あなたが欲しいのは特定のオブジェクトに対して定義されたゲッターのリストです。私の知る限り、このようなものにはdescribeTypeを使用する必要があります(ObjectUtilsが内部でこのメソッドを使用していることは間違いありません)。

ご存知のように、describeTypeを頻繁に呼び出すと遅くなります。しかし、たった13種類の場合、これは問題にならないはずだと思います。これらのタイプは動的ではないため、プロパティが固定されていることがわかります。したがって、このデータを一度取得してキャッシュすることができます。キャッシュは、事前に構築することも、新しいタイプを見つけたときに構築することもできます。

これをコードで行う簡単な方法は次のとおりです。

private var typePropertiesCache:Object = {};

private function getPropertyNames(instance:Object):Array {
    var className:String = getQualifiedClassName(instance);
    if(typePropertiesCache[className]) {
        return typePropertiesCache[className];
    }
    var typeDef:XML = describeType(instance);
    var props:Array = [];
    for each(var prop:XML in typeDef.accessor.(@access == "readwrite" || @access == "readonly")) {
        props.push(prop.@name);
    }   
    return typePropertiesCache[className] = props;
}
于 2010-08-22T04:18:22.330 に答える