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

本文关键字:调用 方法 字符串 实例化 另一个 | 更新日期: 2023-09-27 18:20:13

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

构建我的字符串列表(方法)在我的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-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);
                }
            }
        }
    }

如果能对我做错的事情提供任何帮助,我们将不胜感激。

!!!-----编辑-----!!!

我是个白痴。我把类设置为字符串列表,但我忘了重命名我的方法。对不起。是的,这些方法是公开的,它们是可以访问的,我现在只需要将它们重命名为正确的名称。

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

imo,您使用的调用似乎可以接受。问题是GetType().GetMethod()只能恢复public方法。

请参阅此MSDN链接。

为了访问具有不同访问器的方法,请使用此GetMethod(字符串,BindingFlags)重载。

希望这能有所帮助。

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

有时很难找到使用反射的方法。您当前仅在搜索公共实例方法。当通过反射找到方法看起来相当困难时,我通常会使用具有不同绑定标志的GetMethods(),并手动检查是否存在预期的方法。

请注意,在指定绑定标志时,还必须指定BindingFlags.InvokeMethod | BindingFlags.Instance。此外,考虑以下因素:

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

您可以将所有标志与|组合以搜索所有内容。通过一点尝试和错误,您最终会找到您需要的绑定参数集。