Я написал этот код:
public static bool MyMethod(int someid, params string[] types)
{...}
Как я мог записать тому использованию Func?
public static Func < int, ?params?, bool > MyMethod = ???
Я думаю, вам нужно объявление Func как таковое:
public static Func<int, string[], bool> MyMethod = ???
Ключевое слово 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);
Боюсь, вы не смогли этого сделать.
http://msdn.microsoft.com/en-us/library/w5zay9db%28VS.71%29.aspx
Как насчет таких вспомогательных методов?
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;
}
Короткий ответ, вы не можете, если действительно хотите сохранить функциональность params
.
В противном случае вы могли бы согласиться на:
Func<int, string[], bool> MyMethod = (id, types) => { ... }
bool result = MyMethod(id, types);
Я не думаю, что есть способ объявлять функции через Func ... хотя вы можете просто сделать:
public static bool MyMethod(int someid, params string[] types) {...}
public static Func < int,params string[], bool > MyFunc = MyMethod;