使用另一个已经实例化的类中的字符串调用方法
本文关键字:调用 方法 字符串 实例化 另一个 | 更新日期: 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
您可以将所有标志与|
组合以搜索所有内容。通过一点尝试和错误,您最终会找到您需要的绑定参数集。