【问题标题】:How to pass a function with parameters as an argument to a function? [duplicate]如何将带有参数的函数作为参数传递给函数? [复制]
【发布时间】:2020-11-11 21:06:36
【问题描述】:

我希望创建一个扩展方法,它采用带有IEnumerable<T> 参数的函数。

int NumberOfRetries = 3;
string TableName = "Table";

Method(EnumerableParameter).RetrySection(EnumerableParameter,TableName ,NumberOfRetries);

要扩展的功能

bool Method(IEnumerable<int> param)
{
  foreach(var item in param)
  {
    Console.WriteLine(item);
  }
  return true;
}

我无法编译代码

RetrySection(() => Method(EnumerableParameter),EnumerableParameter,TableName ,NumberOfRetries);

两种选择。

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

我收到错误 Func&lt;IEnumerable&lt;int&gt;,bool&gt; 不接受 0 个参数。

【问题讨论】:

  • 尝试将大括号添加到第一个,例如() =&gt; { return Method(EnumerableParameter); }
  • 在调用该扩展方法时,您必须使用有效的 delegate 实例。您不能扩展原始方法调用本身。您需要传递从该方法创建的委托,这会阻止使用该语言的方法组到委托推理功能。你可以做((Func&lt;IEnumerable&lt;T&gt;, bool&gt;)Method).RetrySection(EnumerableParameter, ...)RetrySection(Method, EnumerableParameter, ...)。虽然坦率地说,我发现要么错过了通用重试实现的重点。请参阅副本以了解您应该如何执行此操作。

标签: c#


【解决方案1】:

解决方法是使用:

Method.RetrySection(EnumerableParameter,TableName ,NumberOfRetries);

因为 RetrySection 被定义用于处理 - Func,而不是结果 - bool。

或者,如果是第二个例子:

RetrySection(Method,EnumerableParameter,TableName ,NumberOfRetries);

【讨论】:

  • 如何调用动作。如果我扩展布尔值,在 do while 循环中?
  • 您不是在扩展布尔值,而是在扩展一个接受 IEnumerable 并返回布尔值的函数:void RetrySection(this Func&lt;IEnumerable&lt;T&gt;,bool&gt; action
  • 我不认为第一个选项编译为Method.RetrySection。您应该将方法转换为 ((Func&lt;IEnumerable&lt;int&gt;, bool&gt;)Method).RetrySection
  • 你说得对@devNull,必填:dotnetfiddle.net/Widget/TqyVJX
猜你喜欢
  • 2020-01-06
  • 2015-11-08
  • 2020-02-21
  • 2013-01-27
  • 2021-04-13
  • 2016-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多