2014-04-07 64 views
0

我當前的代碼:動態調用/調用由它的靜態方法的名稱

public static OrderDraft ParseImportFile(Int32 TemplateId, String FTPUser, String CSVFilePath, Boolean IgnoreError = false) 
{ 
    // Init 
    OrderDraft myOrderDraft = new OrderDraft(); 

    // Anticipate Error 
    try 
    { 
     // Load Sync Template Info 
     SyncTemplateInfo mySyncTemplateInfo = Utils.GetTemplateInfo(TemplateId, IgnoreError); 

     // Switch On Selected Template 
     switch (TemplateId) 
     { 
      // Template #1 
      case 1: 
       myOrderDraft = Parsers.Template1.Parse(FTPUser, CSVFilePath, mySyncTemplateInfo, IgnoreError); 
       break; 

      // Template #2 
      case 2: 
       myOrderDraft = Parsers.Template2.Parse(FTPUser, CSVFilePath, mySyncTemplateInfo, IgnoreError); 
       break; 
     } 
    } 
    catch { } 

    // Finished 
    return myOrderDraft; 
} 

哪裏Parsers是文件夾/命名空間的名稱。 TemplateN是班級的名字。

我想要做的就是動態地調用靜態方法,而不是有一個開關的情況下,一遍又一遍地複製相同的代碼(我可能會開發10多個解析器)。

任何想法,我可以如何實現這一目標?我一看這https://stackoverflow.com/a/1418228/2332336但我不知道我怎麼能爲我自己的代碼做到這一點...

回答

0

我希望下面的可以幫助

 string Parsers = "..."; 
     string TemplateN = "..."; 
     string MethodName = "..."; 

     var q = from t in Assembly.GetExecutingAssembly().GetTypes() 
       where t.IsClass && t.Namespace == Parsers && t.Name == TemplateN 
       select t; 

     Type classType = null; 

     foreach (var item in q) 
     { 
      classType = item;//select the first match 
      break; 
     } 

     if (classType == null) 
     { 
      return; //no matched class 
     } 

     MethodInfo mf = classType.GetMethod(MethodName); 

     if (mf == null) 
     { 
      return; //no matched method 
     } 

     myOrderDraft = mf.Invoke(new object()/*Sender*/,new object[]{}/*parameters*/); 
+0

我想你的建議也。 'classType'爲空。同上。 – Latheesan