【发布时间】: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<IEnumerable<int>,bool> 不接受 0 个参数。
【问题讨论】:
-
尝试将大括号添加到第一个,例如
() => { return Method(EnumerableParameter); } -
在调用该扩展方法时,您必须使用有效的 delegate 实例。您不能扩展原始方法调用本身。您需要传递从该方法创建的委托,这会阻止使用该语言的方法组到委托推理功能。你可以做
((Func<IEnumerable<T>, bool>)Method).RetrySection(EnumerableParameter, ...)或RetrySection(Method, EnumerableParameter, ...)。虽然坦率地说,我发现要么错过了通用重试实现的重点。请参阅副本以了解您应该如何执行此操作。
标签: c#