函数作为参数与params arg

时间:2016-06-12 09:31:34

标签: c#

我有一个带有此签名的函数:

public static async Task LoadAsync<T>(T model, Func<T, PropertyInfo, Task> comparer, params string[] includes) where T: class

我这样调用:

await EagerLoader.LoadAsync(model, SetPropertyValue, includes);

SetPropertyValue 是我传递给 LoadAsync 的函数。它的签名是这样的:

private async Task SetPropertyValue(Account model, PropertyInfo property)

我想做的是将签名更改为:

private async Task SetPropertyValue(Account model, PropertyInfo property, params string[] includes)

如何在 LoadAsync 签名中表示该内容?

1 个答案:

答案 0 :(得分:1)

params限定符不属于该类型。在运行时,它的存在表示为方法参数定义的属性[ParamArray]

如果您将类型更改为

Func<T, PropertyInfo, string[], Task>

你可以通过两个

Task SetPropertyValue(Account model, PropertyInfo property, params string[] includes)

Task SetPropertyValue(Account model, PropertyInfo property, string[] includes)

(即有和没有params)。由于params不属于参数类型,因此string[]通用代理的类型参数中params不能归类为Func

这应该在您的用例中正常工作,因为您的LoadAsync不需要使用变量参数语法调用comparer委托,即LoadAsync将传递整个数组,而不是编译器必须组合成数组的string s的可变长度列表。