c#将参数添加到Func

时间:2016-10-27 11:26:30

标签: c# func

我有这些功能:

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添加参数?

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

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

&#39;一些mysql查询&#39; limit offset,batchsize

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

修改 我不明白投票的原因。

我有多个具有不同签名的功能,可以查询我的数据库。

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

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

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

我希望得到大小为1K,500倍的结果集。

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

2 个答案:

答案 0 :(得分:5)

您只需制作一个Func即可获得单int并返回List<int>

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是全局的,你可能想要注入它,而不是通过使它成为它们所属类的字段而将它传递给这些函数。

答案 1 :(得分:1)

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

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

这是你想从外面传递参数。此外,这是wrapper

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

我希望我理解你的问题。