Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.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# - Fatal编程技术网

C# 如何将带有参数的函数作为参数传递给函数?

C# 如何将带有参数的函数作为参数传递给函数?,c#,C#,我希望创建一个扩展方法,它接受一个参数为IEnumerable的函数 要扩展的功能 对于这两种选择 Method(EnumerableParameter).RetrySection(EnumerableParameter,TableName,NumberOfRetries); 扩展方法 public static void RetrySection(此Func操作、IEnumerable参数、字符串数据库表、int jobcount) { int jobRowCount=ValidateTab

我希望创建一个扩展方法,它接受一个参数为
IEnumerable
的函数

要扩展的功能 对于这两种选择

Method(EnumerableParameter).RetrySection(EnumerableParameter,TableName,NumberOfRetries);
扩展方法
public static void RetrySection(此Func操作、IEnumerable参数、字符串数据库表、int jobcount)
{
int jobRowCount=ValidateTable(databaseTable).GetAwaiter().GetResult();
int重试=0;
做
{
作用(参数);
jobRowCount=ValidateTable(databaseTable).GetAwaiter().GetResult();
重试++;
}
而((jobRowCount<(jobcount*2))&重试<3);
}

我发现错误
Func
不接受0个参数。

解决方案是使用:

Method.RetrySection(EnumerableParameter,TableName ,NumberOfRetries);
因为这是RetrySection定义用于-Func而不是result-bool的内容

或者,在第二个示例的情况下:

RetrySection(Method,EnumerableParameter,TableName ,NumberOfRetries);

尝试向第一个方法添加大括号,如
()=>{return Method(EnumerableParameter);}
调用该扩展方法时必须使用有效的委托实例。无法扩展原始方法调用本身。您需要传递从该方法创建的委托,这将阻止使用该语言的方法组来委托推理功能。您可以执行
((Func)方法).RetrySection(枚举参数,…)
RetrySection(方法,枚举参数,…)
。尽管坦率地说,我发现两种方法都没有达到通用重试实现的目的。请参阅duplicate以了解应该如何执行此操作。如何调用操作。在do while循环中,如果我正在扩展布尔值?您不是在扩展布尔值,而是在扩展一个函数,该函数接受IEnumerable并返回布尔值:
void RetrySection(此Func操作
我认为第一个选项不会编译为
Method.RetrySection
。您应该将该方法转换为
((Func)Method).RetrySection
您在@devNull时是对的,它是必需的:
Method(EnumerableParameter).RetrySection(EnumerableParameter,TableName,NumberOfRetries);
public static void RetrySection(this Func<IEnumerable<T>,bool> action, IEnumerable<T> parameter,string databaseTable,int jobcount)
        {
            int jobRowCount = ValidateTable(databaseTable).GetAwaiter().GetResult();
            int retry = 0;

            do
            {
                action(parameter);

                jobRowCount = ValidateTable(databaseTable).GetAwaiter().GetResult();
                retry++;
            }
            while ((jobRowCount < (jobcount * 2)) && retry < 3);
        }
Method.RetrySection(EnumerableParameter,TableName ,NumberOfRetries);
RetrySection(Method,EnumerableParameter,TableName ,NumberOfRetries);