我写了这段代码:
public static bool MyMethod(int someid, params string[] types)
{...}
我怎么能用Func写这个?
public static Func < int, ?params?, bool > MyMethod = ???
答案 0 :(得分:8)
params
关键字编译为ParamArray
的普通参数。您不能将属性应用于通用参数,因此您的问题是不可能的。
请注意,您仍然可以使用常规(非params
)委托:
Func<int, string[], bool> MyMethodDelegate = MyMethod;
为了将params关键字与委托一起使用,您需要创建自己的委托类型:
public delegate bool MyMethodDelegate(int someid, params string[] types);
你甚至可以把它变成通用的:
public delegate TResult ParamsFunc<T1, T2, TResult>(T1 arg1, params T2[] arg2);
答案 1 :(得分:3)
简短的回答,你不能,如果你真的想要保留params
功能。
否则,你可以满足于:
Func<int, string[], bool> MyMethod = (id, types) => { ... }
bool result = MyMethod(id, types);
答案 2 :(得分:1)
答案 3 :(得分:0)
我认为没有办法通过Func声明函数......尽管你可以这样做:
public static bool MyMethod(int someid, params string[] types) {...}
public static Func < int,params string[], bool > MyFunc = MyMethod;
答案 4 :(得分:0)
我认为你想要一个Func声明:
public static Func<int, string[], bool> MyMethod = ???
答案 5 :(得分:0)
这些辅助方法怎么样?
public static TResult InvokeWithParams<T, TResult>
(this Func<T[], TResult> func, params T[] args) {
return func(args);
}
public static TResult InvokeWithParams<T1, T2, TResult>
(this Func<T1, T2[], TResult> func, T1 arg1, params T2[] args2) {
return func(arg1, args2);
}
显然,你可以为Func
(以及Action
的其他通用重载实现此功能。
用法:
void TestInvokeWithParams() {
Func<string[], bool> f = WriteLines;
int result1 = f.InvokeWithParams("abc", "def", "ghi"); // returns 3
int result2 = f.InvokeWithParams(null); // returns 0
}
int WriteLines(params string[] lines) {
if (lines == null)
return 0;
foreach (string line in lines)
Console.WriteLine(line);
return lines.Length;
}