2011-05-20 37 views
3

我有一個包含指向另一個類的委託變量的方法。 我想通過這個委託來調用該類中的方法,但將該方法的名稱作爲字符串傳遞給包含委託的方法。如何將方法名稱傳遞給另一個方法並通過委託變量調用它?

這怎麼辦?使用反射? Func<T>

編輯:

我現在明白反射可能不是最好的解決方案。

這是我有:

private static void MethodContainingDelegate(string methodNameInOtherClassAsString) 
{ 
     _listOfSub.ForEach(delegate(Callback callback) 
     { 
      //Here the first works, but I want the method to be general and 
      // therefore pass the method name as a string, not specfify it. 
      callback.MethodNameInOtherClass(); 
      //This below is what I am trying to get to work. 
      callback.MethodNameInOtherClassAsString();     
      } 
    }); 
} 

所以,基本上,我正在尋找一種方法,使我的回調委託「認識到」我的methodNameInOtherClassAsString實際上是在其他類來執行的方法。

謝謝!

+2

你可以添加一些僞代碼嗎?我不明白你在問什麼! – Nick 2011-05-20 08:58:56

+0

你可以發佈一些你的代碼嗎? – aL3891 2011-05-20 08:59:30

+0

你有什麼樣的參考?它是一個委託引用,一個包含方法名稱的字符串......? – BoltClock 2011-05-20 09:00:01

回答

3

這很簡單:

public delegate void DelegateTypeWithParam(object param); 
public delegate void DelegateTypeWithoutParam(); 

public void MethodWithCallbackParam(DelegateTypeWithParam callback, DelegateTypeWithoutParam callback2) 
{ 
    callback(new object()); 
    Console.WriteLine(callback.Method.Name); 
    callback2(); 
    Console.WriteLine(callback2.Method.Name); 
} 

// must conform to the delegate spec 
public void MethodWithParam(object param) { } 
public void MethodWithoutParam() { } 

public void PassCallback() 
{ 
    MethodWithCallbackParam(MethodWithParam, MethodWithoutParam); 
} 

不要緊,什麼類做代理變量點。它可以在另一個類中定義 - 沒有太大的區別。

我想你甚至可以從委託變量本身查詢原始方法的名稱而不反射。每個代表都有一個名爲Method的財產。

+0

感謝您的回答。我意識到也許反思不是要走的路,而是考慮到Action ,因爲我可以將該方法作爲方法(動作)傳遞,而不必考慮從字符串轉換。 – kakka47 2011-05-20 16:38:03

2

你可以做這樣的事情:

var mi = typeof(Foo).GetMethods().Single(x => x.Name == "Bar"); 
mi.Invoke(foo, null); 

其中foo是你的目標類,酒吧是你要調用的方法。 但是你應該注意到反射會對你的程序性能產生很大的影響。考慮使用強類型代表。

0

假設你有方法名的字符串表示:

var methodInfo = myObject.GetType().GetMethod(myString); //<- this can throw or return null 
methodInfo.Invoke(myObject, new object[n]{parm1, pram2,...paramn}); 

你需要添加一些錯誤檢查顯然此,如果可以的話應該使用的GetMethod一個更具體的版本。

相關問題