簡體   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