如何在actionscript中获取函数的信息?

时间:2012-09-27 12:57:35

标签: actionscript-3

我经常得到参数不匹配错误,这通常需要我花很多时间来调试program.damn,我真的希望我知道函数的入口要求以及它们来自哪里。

因为我只知道函数变量是一个函数,没有任何其他信息。 我写了像这样的大量代码

    public static function call(func:Function,params:Array = null,addToTailIfNotNull:*=null):void{
        if (func!=null){
            var args:Array =[];
            if(params!=null){
                args = ArrayTools.clone(params); 
            }
            if (addToTailIfNotNull!=null){
                args.push(addToTailIfNotNull);
            }
            func.apply(null,args);
        }
    }

我应该更聪明地做事。

1 个答案:

答案 0 :(得分:2)

我建议您使用flash.utils.describeType()方法。它返回一个XML,其中包含您作为参数传递的对象的描述。

假设你有一个班级:

public class Example {
    public function someMethod(number:Number, string:String):void {

    }
}

你打电话到某个地方:

flash.utils.describeType(Example);

你应该在那里得到一个类似的XML:

<method name="someMethod" declaredBy="com.example::Example" returnType="void">
  <parameter index="1" type="Number" optional="false"/>
  <parameter index="2" type="String" optional="false"/>
  <metadata name="__go_to_definition_help">
    <arg key="pos" value="501"/>
  </metadata>
</method>

我不确定这是你在找什么,就像在你的例子中你传递函数参数那样你会得到一个Function类的描述:

<type name="builtin.as$0::MethodClosure" base="Function" isDynamic="false" isFinal="true" isStatic="false">
  <extendsClass type="Function"/>
  <extendsClass type="Object"/>
  <accessor name="length" access="readonly" type="int" declaredBy="Function"/>
  <accessor name="prototype" access="readwrite" type="*" declaredBy="builtin.as$0::MethodClosure"/>
</type>

但是也许你可以重构你的“调用”方法,这样它就可以获得正确的描述(例如将额外的信息传递给它 - 比如对象类和方法名称 - 所以你可以分析它中的方法签名。不是最美丽的解决方案,但仍然......)