Вызов метода с использованием строки в другом классе, который уже был создан - PullRequest
1 голос
/ 13 января 2012

У меня проблема в том, что я хотел бы вызвать метод из строки. Вот что я делаю:

Построение моего списка строк (методы) в моем пользовательском интерфейсе есть три разных объекта checkboxList

private List<string> MyTest = new List<string>();
private void AddSelectedMethods()
{
        foreach(XName item in BaseTestList.CheckedItems)
        {
            MyTests.Add(item.ToString());
        }
        foreach (XName item in AdminTestList.CheckedItems)
        {
            MyTests.Add(item.ToString());
        }
        foreach (XName item in SubscriberTestList.CheckedItems)
        {
            MyTests.Add(item.ToString());
        }
}

Вот звонящий. Если я беру вызов Reflections и ссылаюсь на метод напрямую, все работает, но я не хочу встраивать огромный список операторов if else.

    private void StartSiteTest(object sender, DoWorkEventArgs e)
    {
        if (!BackWorker1.CancellationPending)
        {
            if (SiteToTest == "estatesales.vintagesoftware.local" || SiteToTest == "localhost")
            {
                es = new EstateSaleTests(site, Sites.First(i => i.SiteUrl == SiteToTest), BasePath, SiteToTest, UseCurrentCompanies);
                foreach (string test in MyTests)
                {

                    // <<<!!!!!!!!  ------ The next line returns null ------ !!!!!!!>>>
                    MethodInfo thisMethod = es.GetType().GetMethod(test);

                    thisMethod.Invoke(es, null);
                }
            }
        }
    }

Любая помощь в том, что я делаю неправильно, будет принята с благодарностью.

!!! ----- РЕДАКТИРОВАТЬ ----- !!!

Я идиот. У меня был установлен класс для списка строк, но я забыл переименовать мои методы Извините за это. Да, Методы были общедоступны, и они доступны, теперь я просто должен переименовать их в правильные имена.

Ответы [ 2 ]

3 голосов
/ 13 января 2012

Вызов, который вы используете, кажется вполне приемлемым, imo.Дело в том, что GetType().GetMethod() способен восстанавливать только public методов.

См. эту ссылку MSDN.

Для доступа к методам с различными процессорами используйте эту GetMethod (string, BindingFlags) перегрузку.

Надеюсь, это поможет.

0 голосов
/ 13 января 2012

Я заметил, что на этот вопрос уже получен хороший ответ, но следующее может все еще быть полезным.

Иногда трудно найти метод, использующий отражение.Вы в настоящее время только ищете общедоступные методы экземпляра.То, что я обычно делаю, когда нахожу метод с помощью отражения, кажется довольно сложным, это использование GetMethods() с разными флагами привязки и проверка вручную, есть ли ожидаемые методы.

Обратите внимание, что при указании флагов привязки вы должны также указать BindingFlags.InvokeMethod | BindingFlags.Instance.Кроме того, учтите следующее:

  • Если метод является методом экземпляра, используйте BindingFlags.Static
  • Если вы не знаете, есть ли у вас право подписи («CalcRoot»)отличается от «calcRoot»), чем использовать BindingFlags.IgnoreCase
  • Если вы считаете, что метод защищенный, внутренний, закрытый или защищенный внутренний, используйте BindingFlags.NonPublic
  • Если вы не уверены,используйте производный тип, используйте BindingFlags.FlattenHierarchy
  • Если вы не уверены, является ли искомое свойство, поле или метод, используйте вместо него GetMembers.

Вы можетеобъедините все флаги с |, чтобы найти все.Немного проб и ошибок вы в конечном итоге найдете необходимый вам набор обязательных параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...