如何使用现有函数并使用Func< ..>编写它在C#?

时间:2010-04-16 13:16:03

标签: c# delegates

我写了这段代码:

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

我怎么能用Func写这个?

public static Func < int, ?params?, bool > MyMethod = ???

6 个答案:

答案 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;
}