2012-12-10 90 views
2

我有一種情況,即提供了字符串列表。列表中的第一個條目是方法的名稱。列表中剩餘的字符串是方法參數。我想使用任務來運行該方法(用於教育目的)。我有問題找出適當的過程,將允許我將方法名稱提供給任務指令。將任務與反射相結合

對於這個例子,我有兩個靜態方法可以作爲任務運行。參數[1] 表示我的選擇。

public class Program 
{ 
    private static ILog log = LogManager.GetLogger 
        (System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

    static void Main(string[] args) 
    { 
     string whichPrint = args[1]; 

     Type type = typeof(Program); 
     MethodInfo meth = type.GetMethod(whichPrint, BindingFlags.Public | 
                  BindingFlags.Static); 

     //this is the problem area....how do I feed the the method or delegate into 
     //the lambda expression ???? 
     Delegate methDel = meth.CreateDelegate(type); 
     Task t = Task.Factory.StartNew(() => methDel("help!!")); 

    } 

    static void printme1(string s) 
    { 
     log.Debug("Printme1 Printing: " + s); 
    } 

    static void printme2(string s) 
    { 
     log.Debug("Printme2 Printing: " + s); 
    } 
} 

由於methDel被視爲變量,我無法編譯。我需要它,或者別的什麼, 被視爲一種方法。我不想使用case/switch語句,因爲我可能有很多可以分配給任務的方法。

+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

5

事實上,你要用這個創建一個新的任務有點不相干。你所需要做的就是弄清楚如何調用這個方法,其餘的只是「開始一個新的任務,然後調用這個方法」。

所以你可能會是這樣的:

public static void CallMethod(List<string> nameAndArguments) 
{ 
    var method = typeof(Program).GetMethod(nameAndArguments[0]); 
    method.Invoke(null, nameAndArguments.Skip(1).ToArray()): 
} 

然後:

Task.Factory.StartNew(() => CallMethod(nameAndArguments)); 

我不認爲這是值得建立一個委託,除非你想獲得更好的性能進行調用該的代表地段次。

2

我想你不需要在這裏委託 - 只需在Action主體中調用方法。另外你的方法是私人的,不是公開的:

MethodInfo meth = type.GetMethod(whichPrint, BindingFlags.NonPublic | 
              BindingFlags.Static); 
Task t = Task.Factory.StartNew(() => meth.Invoke(null, new object[] {"help!!"}));