使用已经实例化的另一个类中的字符串调用方法

时间:2012-01-12 22:08:23

标签: c# winforms

我遇到的问题是我想从字符串中调用一个方法。这就是我在做的事情:

构建我的字符串列表(方法)我的UI中有三个不同的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语句的大量列表。

    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 个答案:

答案 0 :(得分:3)

你使用的电话似乎非常可以接受,imo。 问题是GetType().GetMethod()只能恢复 public方法。

请参阅this MSDN链接。

为了访问具有不同访问者的方法,请使用此GetMethod(string, BindingFlags)重载。

希望这有帮助。

答案 1 :(得分:0)

我注意到这已经得到了很好的回答,但以下内容可能仍然有用。

有时很难找到使用反射的方法。您目前只是在搜索公共实例方法。通过反射找到方法时我通常所做的就是使用GetMethods()使用不同的绑定标记,并手动检查预期的方法是否存在。

请注意,当您指定绑定标志时,必须还指定BindingFlags.InvokeMethod | BindingFlags.Instance。另外,请考虑以下事项:

  • 如果方法是实例方法,请使用BindingFlags.Static
  • 如果您不知道自己是否拥有正确的标题(“CalcRoot”与“calcRoot”不同),请使用BindingFlags.IgnoreCase
  • 如果您认为该方法受到保护,内部,私有或内部受保护,请使用BindingFlags.NonPublic
  • 如果您不确定是否使用派生类型,请使用BindingFlags.FlattenHierarchy
  • 如果您不确定您要查找的是属性,字段或方法,请改用GetMembers

您可以将所有标记与|结合使用以搜索所有内容。通过一些试验和错误,您最终将找到所需的绑定参数集。