使用变量代替函数名称

MTe*_*eck 7 .net c#

我现在正在使用以下内容:

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)

das*_*ght 8

您可以使用委托进行一些准备工作,如下所示:

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)


Guf*_*ffa 6

您可以使用委托:

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)