2014-04-07 66 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