代替功能名称使用的变量 [英] Use variable in place of function name

查看:111
本文介绍了代替功能名称使用的变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我用下面的现在:

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

 

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

这篇关于代替功能名称使用的变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆