我现在正在使用以下内容:
foreach (string file in files) {
switch (filetype.Value) {
case "ReadFile":
ReadFile(file);
break;
case "ReadMSOfficeWordFile":
ReadMSOfficeWordFile(file);
break;
case "ReadMSOfficeExcelFile":
ReadMSOfficeExcelFile(file);
break;
case "ReadPDFFile":
ReadPDFFile(file);
break;
}
}
Run Code Online (Sandbox Code Playgroud)
它有效,但感觉有点不对劲.Python的方式更像是这样的:
foreach string file in files:
filetype.Value(file)
Run Code Online (Sandbox Code Playgroud)
我很难想象C#不能做这样的事情.可能是我的Google技能不好,但我似乎无法弄明白.
解
public static readonly IDictionary<string, Action<string>> FileTypesDict = new Dictionary<string,Action<string>> {
{"*.txt", ReadFile},
{"*.doc", ReadMSOfficeWordFile},
{"*.docx", ReadMSOfficeWordFile},
{"*.xls", ReadMSOfficeExcelFile},
{"*.xlsx", ReadMSOfficeExcelFile},
{"*.pdf", ReadPDFFile},
};
Run Code Online (Sandbox Code Playgroud)
foreach (KeyValuePair<string, Action<string>> filetype in FileTypesDict) {
string[] files = Directory.GetFiles(FilePath, filetype.Key, SearchOption.AllDirectories);
//System.Reflection.MethodInfo ReadFileMethod = ReadFile.GetType().GetMethod(filetype.Value);
foreach (string file in files) {
FileTypesDict[filetype.Key](file);
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用委托进行一些准备工作,如下所示:
private static readonly IDictionary<string,Action<string>> actionByType =
new Dictionary<string,Action<string>> {
{"ReadFile", ReadFile}
, {"ReadMSOfficeWordFile", ReadMSOfficeWordFile}
, {"ReadMSOfficeExcelFile", ReadMSOfficeExcelFile}
, {"ReadPDFFile", ReadPDFFile}
};
Run Code Online (Sandbox Code Playgroud)
在需要调用您的操作时,请按以下步骤操作:
actionByType[actionName](file);
Run Code Online (Sandbox Code Playgroud)
您可以使用委托:
Action<string> action;
switch (filetype.Value) {
case "ReadFile":
action = ReadFile;
break;
case "ReadMSOfficeWordFile":
action = ReadMSOfficeWordFile;
break;
case "ReadMSOfficeExcelFile":
action = ReadMSOfficeExcelFile;
break;
case "ReadPDFFile":
action = ReadPDFFile;
break;
default:
throw new NotImplementedException("Unhandled file type '"+filetype.Value+"'.");
}
foreach (string file in files) {
action(file);
}
Run Code Online (Sandbox Code Playgroud)