[英]How to execute static methods by name
我有一个带有类名称的XML文件,如下所示:
<ActiveMonitorsList>
<MonitorName>CertificatesMonitor</MonitorName>
<MonitorName>ServicesMonitor</MonitorName>
<MonitorName>LogsMonitor</MonitorName>
<MonitorName>DBMonitor</MonitorName>
</ActiveMonitorsList>
每个此类都包含一个方法: bool SingleCheck()
;
我想对该XML文件中的每个类执行bool SingleCheck()
方法。
做这个的最好方式是什么?
这是我到目前为止的内容-它不起作用:
foreach (string monitorName in monitorsList)
{
Type thisType = GetType();
MethodInfo singleMonitorMethod = thisType.GetMethod("{monitorName}.SingleCheck");
bool methodResult = singleMonitorMethod.Invoke(...);
}
提前非常感谢您!
编辑:XML中的每个名称都指向一个单独的类。 每个类具有相同的命名方法: public static bool SingleCheck()
。 我想做的是:
编辑-解决的问题:
最初创建项目时,我为所有监视器都包括了单独的文件夹。 然后我改变了主意,删除了该文件夹,并手动将“相同文件”添加到了解决方案中。 这样-这些文件仍然具有“ using <namespace>.Monitors
” ...这就是为什么我无法列出这些类并且Types仍然为null的原因...
感谢所有建议! ;)
我建议对方法调用进行重载,它需要您提供一个对象(调用实例)和该方法的一组输入参数。
由于它是静态方法,因此您可以轻松地将null
作为第一个参数传递,并且由于您的方法没有任何参数,因此您可以再次轻松地将null
作为第二个值传递。 不要忘记将object
转换为相应的返回类型。 就您而言, bool
。
bool methodResult = (bool)singleMonitorMethod.Invoke(null, null);
要获得正确的Type,您实际上需要知道名称空间! 所以这看起来像这样:
foreach (string monitorName in monitorsList)
{
string typeName = $"{yourNameSpace}.{monitorName}";
Type thisType = Type.GetType(typeName);
MethodInfo singleMonitorMethod = thisType.GetMethod("SingleCheck");
bool methodResult = (bool)singleMonitorMethod.Invoke(null, null);
}
如果循环在相同的名称空间中,则这也应该起作用:
Type thisType = Type.GetType($"{GetType().Namespace}.{monitorName}");
由于以下两个原因, thisType.GetMethod("{monitorName}.SingleCheck")
无法正常工作。 1)您忘记了字符串插值$符号,因此正在搜索一个名为“ {monitorName} .SingleCheck”的方法,该方法显然不存在这样的名称。 2)您需要提供包含方法的类型来代替thisType
。
需要使用实例作为第一个参数来调用调用 -静态方法为null-方法参数为对象数组。
假设您的监视器类与当前类型位于同一程序集中,则需要执行以下操作:
foreach (string monitorName in monitorsList)
{
Type monitorType = GetType().Assembly.GetExportedTypes().Single(x => x.Name == monitorName);
MethodInfo singleMonitorMethod = monitorType.GetMethod("SingleCheck");
bool methodResult = (bool)singleMonitorMethod.Invoke(null, Array.Empty<object>());
}
我不喜欢Array.Empty而不是new object[0]
或new object[] { }
因为它不会每次都创建一个新对象。
编辑:根据Mong Zhu的评论更改了类型发现, GetType(monitorName)
确实需要标准名称。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.