Вызов статического метода с помощью интроспекции в Flex

Все,

Хотя это похоже на другое сообщение, этот пост (не указывает, как это сделать (если это можно сделать) без создания экземпляра объекта. Кроме того, безуспешно я пробовал несколько вариантов на тему:

class[method](arg)
class[method].call(arg)
method.apply(class, arg)

Я новичок в Flex, но использовал Reflection как в C #, так и в Java. Кстати, код, который я пытаюсь заставить работать во Flex, зеркалируется на обоих этих языках и работает должным образом.

Любая помощь приветствуется, спасибо, Тодд

Неработающий код Flex:

    private function ipMethodTester( ipMethodName:String,
             shouldPass:Array, shouldFail:Array):void
    {
        var message:String;
        var entry:String;
        for each(entry in shouldPass)
        {
            message = ipMethodName + ": " + entry + " should pass";
            try
            {
                Assert.assertTrue(message,
                    FieldValidator[ipMethodName](entry));
            }
            catch(e:Error)
            {
               Assert.fail(e.message + " " + message);
            }
        }
        for each(entry in shouldFail)
        {
            message = ipMethodName + ": " + entry + " should fail";
            try
            {
                Assert.assertFalse(message,
                    FieldValidator[ipMethodName](entry));
            }
            catch(e:Error)
            {
               Assert.fail(e.message + " " + message);
            }
        }
    }

Код Java:

private void ipMethodTester(final String ipMethodName,
         final String[] shouldPass, final String[] shouldFail)
{
   Method method;
   try
   {
      method = InetUtil.class.getDeclaredMethod(ipMethodName, String.class);
      method.setAccessible(true);

      for(String entry : shouldPass)
      {
         Object[] invokeArgs = { entry };
         boolean passed = (Boolean)method.invoke(null, invokeArgs);

         assertTrue(ipMethodName + ": " + entry + " should pass", passed);
      }

      for(String entry : shouldFail)
      {
         Object[] invokeArgs = { entry };
         boolean passed = (Boolean)method.invoke(null, invokeArgs);

         assertFalse(ipMethodName + ": " + entry + " should fail", passed);
      }
  }
  catch (final Exception e)
  {
     fail(e.getClass().toString());
  }
}

Код C #:

    private void ipMethodTester(string ipMethodName, string[] shouldPass, string[] shouldFail)
    {
        Type type = typeof (ValidateUtil);
        BindingFlags bindingFlags = BindingFlags.InvokeMethod
            | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static;

        MethodInfo method = type.GetMethod(ipMethodName, bindingFlags);

        foreach(string entry in shouldPass)
        {
            object[] invokeArgs = { entry };
            bool passed = (bool)method.Invoke(null, invokeArgs);

            Assert.IsTrue(passed, ipMethodName + ": " + entry + " should pass");
        }

        foreach(string entry in shouldFail)
        {
            object[] invokeArgs = { entry };
            bool passed = (bool)method.Invoke(null, invokeArgs);

            Assert.IsFalse(passed, ipMethodName + ": " + entry + " should fail");
        }
    }

person Todd    schedule 30.09.2010    source источник
comment
Что за другой пост? Какой код отлично работает на C # / Java? Статические методы в Flex можно вызывать с помощью ClassName.MethodName. Однако я никогда не пробовал делать это с помощью имени динамического метода; Я не уверен, как это сработает.   -  person JeffryHouser    schedule 30.09.2010
comment
Запрошенная информация представлена ​​в обновлении вопроса.   -  person Todd    schedule 30.09.2010
comment
Команда try-catch в циклах кода Flex предназначена для отладки.   -  person Todd    schedule 01.10.2010


Ответы (1)


Это работает для меня:

MyClass['myMethod']('arg1','arg2');

Это тоже работает:

MyClass['myMethod'].call(MyClass, 'arg1', 'arg2');

Примечание: первый аргумент метода call (в данном случае MyClass) просто указывает, на какой объект ссылаются, когда вы используете ключевое слово this внутри функции.

person Dane    schedule 30.09.2010
comment
Дэйн, считаются ли слова в галочки строками? - person Todd; 30.09.2010
comment
Я получаю ошибку 1034: Принуждение типа не удалось с обоими из них. Я проверил, и мой тип arg соответствует типу arg статического метода. Не знаю, откуда еще могло исходить принуждение. - person Todd; 30.09.2010
comment
Дэйн, добавил нефункционирующий гибкий код к исходному вопросу. - person Todd; 01.10.2010
comment
Хм, мне кажется, это нормально. Я думаю, что проблема должна возникать где-то еще в вашем коде. - person Dane; 01.10.2010
comment
Дэйн, мне нужно больше разъяснений по аргументам. Все ли передаваемые значения должны быть строками или вы указываете, что myMethod принимает строковые аргументы? - person Todd; 01.10.2010
comment
Последний. Аргументы могут быть любого типа, но в моем примере я использовал строки. - person Dane; 01.10.2010
comment
Дэйн, спасибо за вашу помощь и терпение. Судя по всему, инициализация моего статического блока - это корень ошибок. - person Todd; 01.10.2010