我正在尝试创建一个在目录中的每个文件上执行某些内容的应用程序。
某事应该是某种方法。但是,由于我不知道哪种方法,确切地说,我正试图让它成为我的“迭代”#34; method接受任何方法或某种方法引用的参数,因此他可以在每个文件上调用它。
关键在于如何处理每个文件以及用户选择他想要的文件有很多选项。这些选项也必须是可以扩展的,所以一周后我可能会决定添加一个新的,这就是我需要的原因:
一种方法,可以调用任何方法,而不需要事先了解其签名。
动作和功能对我有用,因为它们需要具体的签名。代理人也是如此,据我所知和(我认为)他们不能作为方法参数传递。
我想要实现的目标:
void Iterate(DirectoryInfo dir, method dostuff)
{
foreach(var file in dir.GetFiles())
{
dostuff(file);
//And this is the point where I feel stupid...
//Now I realise I need to pass the methods as Action parameters,
//because the foreach can't know what to pass for the called method
//arguments. I guess this is what Daisy Shipton was trying to tell me.
}
}
答案 0 :(得分:4)
您的想法可以实现,但某事的功能必须始终具有相同的签名;为此,您可以使用预定义的委托类型。请考虑以下代码段。
public void SomethingExecuter(IEnumerable<string> FileNames, Action<string> Something)
{
foreach (string FileName in FileNames)
{
Something(FileName);
}
}
public void SomethingOne(string FileName)
{
// todo - copy the file with name FileName to some web server
}
public void SomethingTwo(string FileName)
{
// todo - delete the file with name FileName
}
第一个功能可以如下使用。
SomethingExecuter(FileNames, SomethingOne);
SomethingExecuter(FileNames, SomethingTwo);
我希望这会有所帮助。