[英]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.