Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使一个方法可以执行传递给它的任何其他方法_C#_Delegates_Action_Call_Func - Fatal编程技术网

C# 如何使一个方法可以执行传递给它的任何其他方法

C# 如何使一个方法可以执行传递给它的任何其他方法,c#,delegates,action,call,func,C#,Delegates,Action,Call,Func,我正在尝试制作一个应用程序,它将对目录中的每个文件执行某些操作 那东西应该是某种方法。但由于我不知道具体是哪种方法,所以我试图使我的“迭代”方法接受任何方法的参数或某种方法引用,这样他就可以在每个文件上调用它 关键是,关于如何处理每个文件有很多选项,用户可以选择他想要的。这些选项也必须可以延长,因此一周后我可能会决定添加一个新选项,这就是为什么我需要: 一种方法,可以调用任何方法,而不必事先知道其签名 操作和函数对我来说不起作用,因为它们需要一个具体的签名。就我所知,委托也是如此,而且(我认为)

我正在尝试制作一个应用程序,它将对目录中的每个文件执行某些操作

那东西应该是某种方法。但由于我不知道具体是哪种方法,所以我试图使我的“迭代”方法接受任何方法的参数或某种方法引用,这样他就可以在每个文件上调用它

关键是,关于如何处理每个文件有很多选项,用户可以选择他想要的。这些选项也必须可以延长,因此一周后我可能会决定添加一个新选项,这就是为什么我需要:

一种方法,可以调用任何方法,而不必事先知道其签名

操作和函数对我来说不起作用,因为它们需要一个具体的签名。就我所知,委托也是如此,而且(我认为)它们不能作为方法参数传递

我想要实现的示例:

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

你的想法是可以实现的,但是做某事的函数必须始终具有相同的签名;为此,可以使用预定义的委托类型。考虑下面的片段。

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
}

我希望这会有所帮助。

您的想法可以实现,但是执行某些操作的函数必须始终具有相同的签名;为此,可以使用预定义的委托类型。考虑下面的片段。

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
}


我希望这有帮助。

假设我向您传递一个包含5个参数的方法。您的代码将拥有的唯一信息大概是文件名。这可以用于一个参数-您希望为其他四个参数提供哪些参数?我真的认为你会想要
动作
或类似的动作。这可能是你想要用装饰器模式做的事情。实例对于每个可能的选项,您都会创建一个concretedecorator类,该类具有自己的逻辑和参数数量。为了进一步说明Daisy的观点,这意味着需要捕获您可能应用于这些任意方法的任何其他参数化,可能需要使用lambda等,这意味着您应该始终能够使用单个参数将任意方法转换为
操作
,而您的代码应该使用转换后的方法accept@DaisyShipton达米恩:……什么?我不明白你的意思。我的目标是能够执行复制操作(只需要一个字符串作为目标目录)和重命名操作(需要“旧字符串”和“新字符串”参数)。让我们以重命名操作为例——有关重命名文件的信息从何而来?假设我向您传递一个包含5个参数的方法。您的代码将拥有的唯一信息大概是文件名。这可以用于一个参数-您希望为其他四个参数提供哪些参数?我真的认为你会想要
动作
或类似的动作。这可能是你想要用装饰器模式做的事情。实例对于每个可能的选项,您都会创建一个concretedecorator类,该类具有自己的逻辑和参数数量。为了进一步说明Daisy的观点,这意味着需要捕获您可能应用于这些任意方法的任何其他参数化,可能需要使用lambda等,这意味着您应该始终能够使用单个参数将任意方法转换为
操作
,而您的代码应该使用转换后的方法accept@DaisyShipton达米恩:……什么?我不明白你的意思。我的目标是能够执行复制操作(只需要一个字符串作为目标目录)和重命名操作(需要“旧字符串”和“新字符串”参数)。让我们以重命名操作为例——有关重命名文件的信息从何而来?复制/粘贴
SomethingOne
太快了。另外,我认为在
public
之后应该有一个
void
those@Rafalon我已经解决了你的建议。哦,你是说我应该让我所有的something方法都像Actions一样?@J.Doe不,我想你也可以调用
SomethingExecuter(文件名,x=>[whatever])带有lambas@J.Doe不,这只是为了举例说明。当所有函数都有相同的签名时,您的想法才最有意义。复制/粘贴
某个东西的速度太快了。另外,我认为在
public
之后应该有一个
void
those@Rafalon我已经解决了你的建议。哦,你是说我应该让我所有的something方法都像Actions一样?@J.Doe不,我想你也可以调用
SomethingExecuter(文件名,x=>[whatever])带有lambas@J.Doe不,这只是为了举例说明。当所有函数都具有相同的签名时,您的想法最有意义。