2014-03-02 41 views
0

我正在嘗試使用反射來動態調用一個函數並且不太確定如何使它工作。使用反射來動態地調用一個函數會給出錯誤:非靜態方法需要一個目標

這是我的主要功能:

public partial class WorkerRole : RoleEntryPoint 
{ 
    public override void Run() 
    { 
     while (true) 
     { 
      List<string> Firms = new List<string>(); 

      Firms.Add("BHP"); 

      foreach (string Firm in Firms) 
      { 

       typeof(WorkerRole).GetMethod(string.Format("{0}GetProfiles", Firm), BindingFlags.Instance | BindingFlags.Public).Invoke(null, null); 
      } 

      break; 
     } 

     Thread.Sleep(Timeout.Infinite); 

    } 
} 

這裏是我動態調用(它們都具有相同的簽名)的功能中的一個例子:

public partial class WorkerRole : RoleEntryPoint 
{ 

    public List<string> BHPGetProfiles() 
    { 
     // Do tasks specific to BHP 
    } 
} 

的錯誤,我進入以typeof開頭的行是:

附加信息:非靜態方法需要一個目標。

我不希望我的GetProfiles方法是靜態的,但我認爲添加BindingFlags.Instance應該解決了這個問題?

感謝您的幫助!

回答

4

你是對的BindingFlags.Instance意味着你的方法不是靜態的。因此,您撥打GetMethod的電話不會返回null

相反,問題是您的Invoke呼叫提供null而不是呼叫中的this的對象。它應該是第一個參數。例如,如果你想被要求在其Run()正在執行對象的方法,你應該使用:

typeof(WorkerRole).GetMethod(string.Format("{0}GetProfiles", Firm), 
    BindingFlags.Instance | BindingFlags.Public).Invoke(this, null); 

更多細節上Invokethis MSDN page

+0

好吧,這是有道理的 - 我的回報列表最終?我如何將它分配給一個變量? – Evonet

+0

@Evonet它由Invoke方法作爲'object'返回,所以你必須將它轉換爲你的'List '。 – Dirk

相關問題