Как я могу взять существующую функцию и записать этому использование Func <..> в C#?

Я написал этот код:

public static bool MyMethod(int someid, params string[] types)
{...}

Как я мог записать тому использованию Func?

public static Func < int, ?params?, bool > MyMethod = ???
7
задан David Basarab 16 April 2010 в 13:23
поделиться

6 ответов

Я думаю, вам нужно объявление Func как таковое:

public static Func<int, string[], bool> MyMethod = ???
0
ответ дан 6 December 2019 в 21:11
поделиться

Ключевое слово 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);
8
ответ дан 6 December 2019 в 21:11
поделиться

Боюсь, вы не смогли этого сделать.

http://msdn.microsoft.com/en-us/library/w5zay9db%28VS.71%29.aspx

1
ответ дан 6 December 2019 в 21:11
поделиться

Как насчет таких вспомогательных методов?

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;
}
0
ответ дан 6 December 2019 в 21:11
поделиться

Короткий ответ, вы не можете, если действительно хотите сохранить функциональность params .

В противном случае вы могли бы согласиться на:

Func<int, string[], bool> MyMethod = (id, types) => { ... }

bool result = MyMethod(id, types);
3
ответ дан 6 December 2019 в 21:11
поделиться

Я не думаю, что есть способ объявлять функции через Func ... хотя вы можете просто сделать:

public static bool MyMethod(int someid, params string[] types) {...}
public static Func < int,params string[], bool > MyFunc = MyMethod;
0
ответ дан 6 December 2019 в 21:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: