estoy usando el siguiente momento:Uso variable en lugar del nombre de la función
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;
}
}
Funciona, pero se siente un poco mal. La forma en Python sería algo más parecido a esto:
foreach string file in files:
filetype.Value(file)
tengo un momento muy difícil imaginar que C# no se puede hacer algo como esto. Puede ser que mis habilidades de Google sean malas, pero parece que no puedo resolverlo.
SOLUCIÓN
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);
}
}
I lo siento pero no puedo descifrar qué es filetype? –
Considere hacer que los valores de los cambios sean enum en lugar de cadena. No es una solución a su problema, pero es una buena práctica para asegurarse de detectar errores en el tiempo de compilación. – Stilgar
Muéstrenos la forma en que obtiene/construye '' fileType''s. Posiblemente un cambio menor allí (que proporciona un delegado en lugar de una cadena) hace que todo desaparezca fácilmente. –