我有一段代码:
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
是该类的名称。
我希望能够做的是动态调用静态方法,而不是使用switch case并反复复制相同的代码(我可能会开发超过10个解析器)。
知道如何实现这一目标吗?我看了一下https://stackoverflow.com/a/1418228/2332336,但我不知道如何为我自己的代码做这个...
答案 0 :(得分: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*/);