簡體   English   中英

如何運行僅知道她的完全限定名稱的任何方法

[英]How to run any method knowing only her fully qualified name

我有一個方法的名稱:“ Garden.Plugins.Code.Beta.Business.CalculateRest”

怎么運行呢? 我考慮過像RunMethod(string MethodName)這樣基於花式反射的解決方案

  • 通過在最后一個點上將其拆分為類型名稱和方法名稱
  • 使用Type.GetTypeAssembly.GetType獲取類型。 (除非您在參數中指定程序集名稱,否則Type.GetType將僅在當前正在執行的程序集和mscorlib中查找。)
  • 使用Type.GetMethod從類型中獲取方法。 假定它是一個公共靜態方法,請指定BindingFlags.Public | BindingFlags.Static BindingFlags.Public | BindingFlags.Static
  • 通過調用MethodInfo.Invoke (null,null)執行該方法。 (第一個空值指定“無目標”-即它是靜態方法;第二個空值不指定參數。)

如果要調用一個實例方法或一個帶有參數的方法,則還需要弄清楚如何獲取該信息。

它不像將最后一個點左側的所有內容都當作文字類型名稱那樣簡單。 如果您具有以下形式的表單:

XYZ類型

那么X,Y和Z不一定是命名空間。 它們本身也可以是類型,而后續部分可以是內部類:

class X
{
  class Y
  {
   // etc
  }
}

如果是這種情況,那么Type.GetType(“ X.YU”)不會解析為Y類。相反,clr用+符號分隔內部類,因此您實際上需要調用Type.GetType(“ X + Y“);

如果您要調用的方法是params方法,那么您需要做一些額外的工作。 您需要將變量參數匯總到一個數組中並傳遞它。 您可以通過獲取方法的ParameterInfo數據並查看最后一個參數是否附加了ParamArray屬性來檢查變量參數。

會慢的,相信我。 因此,請勿將其放在關鍵位置。

除此之外,您只需要“手工”即可。 開始枚舉所有名稱空間,類等,直到找到所需的內容。 我不認為已經有任何花哨的預制物可以做到這一點。 (盡管我沒有搜索)

如果類型是實例類型:

Type.GetType("Garden.Plugins.Code.Beta.Business")
    .GetMethod("CalculateRest").Invoke(myInstanceOfTheType, param1, param2);

如果是靜態方法:

Type.GetType("Garden.Plugins.Code.Beta.Business")
    .GetMethod("CalculateRest").Invoke(null, param1, param2);

如果不帶參數,則忽略“ param1,param2等” ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM