Как создать метод, который может выполнять любой другой метод, переданный ему - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь создать приложение, которое будет что-то для каждого файла в каталоге.

Что что-то должно быть каким-то методом.Но поскольку я не знаю, какой именно метод, я пытаюсь сделать так, чтобы мой «итеративный» метод принимал аргумент любого метода или какую-либо ссылку на метод, поэтому он может вызывать его для каждого файла.

Дело в том, что существует множество вариантов того, что делать с каждым файлом, и пользователь выбирает тот, который ему нужен.Опции также должны быть открыты для расширения, поэтому через неделю я могу решить добавить новую, поэтому мне нужно:

Метод, который может вызывать любой метод безпредварительное знание его подписи.

Действия и функции не работают для меня, потому что им нужна конкретная подпись.Как и делегаты, насколько я знаю, и (я думаю) они не могут быть переданы в качестве параметра метода.

Пример того, чего я хочу достичь:

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

1 Ответ

0 голосов
/ 30 мая 2018

Ваша идея может быть реализована, однако функция, которая делает что-то , всегда должна иметь одинаковую подпись;для этого вы можете использовать предопределенные типы делегатов.Рассмотрим следующий фрагмент.

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

Надеюсь, это поможет.

...