c#给Func添加参数
c# add parameters to 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 添加参数?
如果我想这样做的原因是相关的:
我有很多函数,具有不同的签名,可以查询不同的数据库表。
其中一些查询的结果集太大,所以我想使用 (MySQL) Limit 函数:
'some mysql query' limit offset,batchsize
然后在包装函数中连接结果。
所以我在一些函数中添加了额外的参数(offset,batchsize),我希望包装函数将这些参数添加到 Func 指向的函数中。
编辑:
我不明白投反对票的原因。
我有多个具有不同签名的函数来查询我的数据库。
问题是在某些情况下,结果集太大而导致超时异常。
由于结果集太大,我想得到小块的结果集,然后将它们拼接成完整的结果集。
例如:原结果集大小为500K,导致超时。
我想要得到大小为 1K、500 次的结果集。
这就是为什么我需要从 Wrapper 内部控制偏移量,以便在每次迭代时,我可以将每次迭代后递增的偏移量作为参数发送给原始函数。
您只需要制作一个 Func
将单个 int
和 returns 与 List<int>
.
public List<int> Wrapper(Func<int, List<int>> queryFunc)
{
var offset = 5;
return queryFunc(offset);
}
然后您必须通过传入 lambda 来使用它,您可以在其中使用所需的参数调用其他函数,并将 lambda 参数作为 offset
.
传入
var result1 = Wrapper(o => GetInts(someParam, o));
var result2 = Wrapper(o => GetMoreInts(someParam, anotherParam, o));
虽然我不确定它到底有多大用处。如果 offset
是全局变量,您可能希望注入它而不是通过将其作为它们所属的 class 的字段将其传递给这些函数。
我认为你的包装应该是这样的:
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)
希望我已经理解你的问题。
我有这些功能:
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) Limit 函数:
'some mysql query' limit offset,batchsize
然后在包装函数中连接结果。 所以我在一些函数中添加了额外的参数(offset,batchsize),我希望包装函数将这些参数添加到 Func 指向的函数中。
编辑: 我不明白投反对票的原因。
我有多个具有不同签名的函数来查询我的数据库。
问题是在某些情况下,结果集太大而导致超时异常。
由于结果集太大,我想得到小块的结果集,然后将它们拼接成完整的结果集。
例如:原结果集大小为500K,导致超时。
我想要得到大小为 1K、500 次的结果集。
这就是为什么我需要从 Wrapper 内部控制偏移量,以便在每次迭代时,我可以将每次迭代后递增的偏移量作为参数发送给原始函数。
您只需要制作一个 Func
将单个 int
和 returns 与 List<int>
.
public List<int> Wrapper(Func<int, List<int>> queryFunc)
{
var offset = 5;
return queryFunc(offset);
}
然后您必须通过传入 lambda 来使用它,您可以在其中使用所需的参数调用其他函数,并将 lambda 参数作为 offset
.
var result1 = Wrapper(o => GetInts(someParam, o));
var result2 = Wrapper(o => GetMoreInts(someParam, anotherParam, o));
虽然我不确定它到底有多大用处。如果 offset
是全局变量,您可能希望注入它而不是通过将其作为它们所属的 class 的字段将其传递给这些函数。
我认为你的包装应该是这样的:
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)
希望我已经理解你的问题。