繁体   English   中英

如何按名称执行静态方法

[英]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(...);
}
  • 代替(...)-不知道在这里放什么,但是我想获取方法的结果(总是布尔)。
  • 我想通过的所有这些方法都是静态的。
  • 我想代表,Actions或Func <>必须在这里...

提前非常感谢您!

编辑: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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM