我遇到的问题是我想从字符串中调用一个方法。这就是我在做的事情:
构建我的字符串列表(方法)我的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);
}
}
}
}
对我所做错的任何帮助都将不胜感激。
!!! -----编辑----- !!!
我是个白痴。我将类设置为字符串列表但我忘了重命名我的方法抱歉。是的,方法是公开的,它们是可访问的,我只需要将它们重命名为正确的名称。答案 0 :(得分:3)
你使用的电话似乎非常可以接受,imo。
问题是GetType().GetMethod()
只能恢复 public
方法。
请参阅this MSDN链接。
为了访问具有不同访问者的方法,请使用此GetMethod(string, BindingFlags)重载。
希望这有帮助。
答案 1 :(得分:0)
我注意到这已经得到了很好的回答,但以下内容可能仍然有用。
有时很难找到使用反射的方法。您目前只是在搜索公共实例方法。通过反射找到方法时我通常所做的就是使用GetMethods()
使用不同的绑定标记,并手动检查预期的方法是否存在。
请注意,当您指定绑定标志时,必须还指定BindingFlags.InvokeMethod | BindingFlags.Instance
。另外,请考虑以下事项:
BindingFlags.Static
BindingFlags.IgnoreCase
BindingFlags.NonPublic
BindingFlags.FlattenHierarchy
GetMembers
。您可以将所有标记与|
结合使用以搜索所有内容。通过一些试验和错误,您最终将找到所需的绑定参数集。