代替功能名称使用的变量变量、名称、功能

2023-09-04 02:11:21 作者:孤独客

我用下面的现在:

 的foreach(在文件中字符串的文件){
    开关(filetype.Value){
        案的ReadFile:
            ReadFile的(文件);
            打破;
        案ReadMSOfficeWordFile:
            ReadMSOfficeWordFile(文件);
            打破;
        案ReadMSOfficeExcelFile:
            ReadMSOfficeExcelFile(文件);
            打破;
        案ReadPDFFile:
            ReadPDFFile(文件);
            打破;
    }
}
 

它的工作原理,但感觉有点不对。 Python的办法是更多的东西是这样的:

在文件

 的foreach字符串的文件:
    filetype.Value(文件)
 

我有一个很艰难的时期想象C#中不能做这样的事情。这可能是我的谷歌技能是不好的,但我似乎无法找到答案。

解决方案:

 公共静态只读的IDictionary<字符串,动作<字符串>> FileTypesDict =新字典<字符串,动作<字符串>> {
    {的* .txt,ReadFile的},
    {的* .doc,ReadMSOfficeWordFile},
    {* .DOCX,ReadMSOfficeWordFile},
    {的* .xls,ReadMSOfficeExcelFile},
    {*的.xlsx,ReadMSOfficeExcelFile},
    {* .PDF,ReadPDFFile},
};
 
python函数

 

 的foreach(KeyValuePair<字符串,动作<字符串>>文件类型在FileTypesDict){
    字符串[]文件= Directory.GetFiles(文件路径,filetype.Key,SearchOption.AllDirectories);
    //System.Reflection.MethodInfo ReadFileMethod = ReadFile.GetType()GetMethod的(filetype.Value)。
    的foreach(在文件中字符串的文件){
        FileTypesDict [filetype.Key](文件);
    }
}
 

解决方案

您可以使用委托,像这样的一些preparation做到这一点:

 私有静态只读的IDictionary<字符串,动作<字符串>> actionByType =
    新的字典<字符串,动作<字符串>> {
        {ReadFile的,ReadFile的}
    ,{ReadMSOfficeWordFile,ReadMSOfficeWordFile}
    ,{ReadMSOfficeExcelFile,ReadMSOfficeExcelFile}
    ,{ReadPDFFile,ReadPDFFile}
    };
 

当是时候打电话给你的行动,做到这一点,如下所示:

  actionByType [actionName](文件);
 

I'm using the following right now:

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;
    }
}

It works, but it feels kinda wrong. The Python way would be something more like this:

foreach string file in files:
    filetype.Value(file)

I have a really hard time imagining that C# can't do something like this. It may be that my Google skills are bad, but I can't seem to figure it out.

SOLUTION

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},
};

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);
    }
}

解决方案

You can do it with some preparation using delegates, like this:

private static readonly IDictionary<string,Action<string>> actionByType =
    new Dictionary<string,Action<string>> {
        {"ReadFile", ReadFile}
    ,   {"ReadMSOfficeWordFile", ReadMSOfficeWordFile}
    ,   {"ReadMSOfficeExcelFile", ReadMSOfficeExcelFile}
    ,   {"ReadPDFFile", ReadPDFFile}
    };

When it is time to call your action, do it as follows:

actionByType[actionName](file);

 
精彩推荐