2011-03-18 60 views
1

我想检查对象是否在名称空间中有一个已定义的成员。如果试图用hasOwnProperty法的QName,但它不支持:如何检查对象是否在名称空间内有属性?

package { 

    import flexunit.framework.Assert; 

    public class ObjectTest extends Object { 

     public namespace some_public_namespace; 

     some_public_namespace var definedMember : String; 

     [Test] 
     public function testMemberWithinNamespace() : void { 

      // this should be elegant way... but actualy it doesn't work 
      try { 
       Assert.assertTrue("Expect hasOwnProperty method work with QName", this.hasOwnProperty(new QName(some_public_namespace, "definedMember"))); 
      } catch (error : Error) { 
       Assert.assertTrue("hasOwnProperty method failed to work with QName", false); 
      } 

      // this is non elegant way that works 
      try { 
       this[ new QName(some_public_namespace, "definedMember") ]; 
       Assert.assertTrue("Expect no error", true); 
      } catch (error : Error) { 
       Assert.assertTrue("Expect this line not to be runned", false); 
      }  


      try { 
       this[ new QName(some_public_namespace, "undefinedMember") ]; 
       Assert.assertTrue("Expect this line not to be runned", false); 
      } catch (error : Error) { 
       Assert.assertTrue("Expect property doesn't exist", true); 
      } 

     } 


    } 

} 

回答

1

据我所知道的,最好的办法是尝试访问属性。

例如,效用函数,这是否:

public static function propertyIsAvailable(object:Object, 
     propertyName:Object):Boolean 
{ 
    var available:Boolean = false; 

    try { 
     var v:* = object[propertyName]; 
     available = true; 
    } catch (e:Error) { 
    } 

    return available; 
} 

然后你可以检查公众和命名空间属性:

var available:Boolean = propertyIsAvailable(object, "myPublicProperty"); 

var available:Boolean = propertyIsAvailable(object, 
    new QName(some_namespace, "myNamespaceProperty")); 
相关问题