【问题标题】:c# add parameters to Funcc#给Func添加参数
【发布时间】:2016-10-27 11:26:30
【问题描述】:

我有这些功能:

public List<int> GetInts(int someParam)
public List<int> GetMoreInts(int someParam, int anotherParam)

我更改了这些函数的签名,以便它们获得额外的可选参数:

public List<int> GetInts(int someParam, int offset = 0)
public List<int> GetMoreInts(int someParam, int anotherParam, int offset = 0)

现在,我想调用一个包装函数,它将使用附加的可选参数调用这些函数:

public List<int> Wrapper(Func<List<int>> queryFunc)
{
    var offset = 5;
    return queryFunc(offset);
}

我会这样调用包装器:

List<int> result = Wrapper(() => GetInts(0));

我怎样才能完成它?当我不知道 Func 指向的函数的签名时,如何向 Func 添加参数?

如果我想这样做的原因是相关的:

我有许多函数,具有不同的签名,可以查询不同的数据库表。 其中一些查询的结果集太大,所以我想使用(MySQL)限制函数:

'some mysql query'limit offset,batchsize

然后在包装函数处连接结果。 所以我在一些函数中添加了额外的参数(offset,batchsize),并且我希望包装函数将这些参数添加到Func指向的函数中。

编辑: 我不明白投反对票的原因。

我有多个具有不同签名的函数来查询我的数据库。

问题是在某些情况下,结果集太大,我得到一个超时异常。

由于结果集太大,我想得到一小块结果集,然后将它们全部连接成完整的结果集。

例如:原始结果集大小为 500K 导致超时。

我想获得大小为 1K、500 次的结果集。

这就是为什么我需要在 Wrapper 中控制偏移量,以便在每次迭代时,我可以将每次迭代后递增的偏移量作为参数发送给原始函数。

【问题讨论】:

  • 您根本不传递Func&lt;List&lt;int&gt;&gt;,而是传递Func&lt;List&lt;int&gt;, int&gt;
  • 某事like this?
  • 我感觉你在做那种“你的团队会讨厌第 2 卷的编程技巧”。
  • @Felype 我编辑了这个问题,试图更好地解释它。我认为我的设计没有问题,但很想听听建议

标签: c# func


【解决方案1】:

您只需要创建一个Func,它接受单个int 并返回List&lt;int&gt;

public List<int> Wrapper(Func<int, List<int>> queryFunc)
{
    var offset = 5;
    return queryFunc(offset);
}

然后,您必须通过传入 lambdas 来使用它,在其中使用所需的参数调用其他函数,并将 lambdas 参数作为 offset 传入。

var result1 = Wrapper(o => GetInts(someParam, o));
var result2 = Wrapper(o => GetMoreInts(someParam, anotherParam, o));

虽然我不确定它到底有多大用处。如果offset 是全局的,您可能希望将其注入而不是将其传递给这些函数,方法是使其成为它们所属的类的字段。

【讨论】:

  • 如果您不想要返回值,请尝试使用Action 而不是Func
  • 或者指定Func的返回类型为List
  • @Andrei 是的,错过了那部分。
  • @TânNguyễn 不,我只是忘了添加返回类型。
  • 实际上,您的答案非常有用,因为偏移量将针对每个函数。所以我可以这样做: var result = Wrapper(offset => GetInts(1,offset), 5) public List Wrapper(Func> queryFunc, int offset){ return queryFunc(抵消);现在我可以在每次将包装器用于任何查询函数时使用不同的偏移量,而不管其签名如何,这很棒
【解决方案2】:

我认为你的包装器应该是这样的:

 public List<int> Wrapper(int x, int y, Func<int,int,List<int>> queryFunc)
    {            
        return queryFunc(x, y);            
    }

这是如果您想从外部传递参数。另外,这是wrapperpublic List<int> GetMoreInts(int someParam, int anotherParam, int offset = 0)

我希望我已经理解了您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    相关资源
    最近更新 更多