Как динамически вызывать метод установки с аргументами во флэш-памяти AS3 - PullRequest
1 голос
/ 04 июля 2011

Эта функция AS3 работает для обычных методов и методов получения:

   public function MyClassTestAPI(functionName:String, ...rest):* {
    var value:*;            
        try {
            switch(rest.length) {
                case 0:
                    value = myObj[functionName];
                    break;
                case 1:
                    value = myObj[functionName].call(functionName, rest[0]);
                    break;
                case 2:
                    value = myObj[functionName].call(functionName, rest[0],rest[1]);
                    break;
                default:
                    throw("Cannot pass more than 2 parameters (passed " + rest.length + ")");
            }                
        } 
        return value;                
    }

Пример использования:

this.MyClassTestAPI("Foo", "arg1"); // tests function Foo(arg1:String):String
this.MyClassTestAPI("MyProperty");  // tests function get MyProperty():String
this.MyClassTestAPI("MyProperty", "new value");// tests function set MyProperty(val:String):void

Третий вызов не работает (исключение). Как я могу заставить это работать и для методов установки? Спасибо!

редактирование:
Это версия, которая работает, кроме как с getter и setter, которые имеют дополнительные параметры. Это нормально для моих нужд:

   public function MyClassTestAPI(functionName:String, ...rest):* {
    var value:*;            
        try {
            if (typeof(this.mediaPlayer[functionName]) == 'function') {
                switch(rest.length) {
                case 0:
                    value = myObj[functionName].call(functionName);
                    break;
                case 1:
                    value = myObj[functionName].call(functionName, rest[0]);
                    break;
                case 2:
                    value = myObj[functionName].call(functionName, rest[0],rest[1]);
                    break;
                default:
                    throw("Cannot pass more than 2 parameters (passed " + rest.length + ")");
                }                
            }  else {
                switch(rest.length) {
                case 0:
                    value = myObj[functionName];
                    break;
                case 1:
                    myObj[functionName] = rest[0];
                    break;
                default:
                    throw("Cannot pass parameter to getter or more than one parameter to setter (passed " + rest.length + ")");
               }                
            }
        } 
        return value;                
    }

Ответы [ 2 ]

1 голос
/ 04 июля 2011

Функции Setter работают как переменные, поэтому вы не можете использовать их следующим образом:

    myProperty.call( "new value" );

Ваша функция для переменных бессмысленна, потому что вам просто нужно присвоить значение:

    myProperty = "new value";

Кстати, вы можете включить его в свою функцию двумя способами:

  1. создайте третий параметр, который сообщает вашей функции, что это функция или переменная
  2. создать присвоение значения в секции catch
0 голосов
/ 04 июля 2011

В настоящее время вы передаете только одну строку со значением «новое значение»

Это должно помочь:

this.MyClassTestAPI("MyProperty", "new","value");

Для получения дополнительной информации по этому вопросу проверьте Adobe LiveDocs на:1006 *http://livedocs.adobe.com/flex/3/html/help.html?content=03_Language_and_Syntax_19.html

Приветствия

...