在C#中作为Func操作

时间:2014-05-30 17:40:51

标签: c# lambda action func

我有一个以Func作为参数的参数方法

SomeType SomeMethod<T>( Func<T, T> f ) {...}

我想传递Action而不必重载方法。但这会解决问题,您如何表示Action作为Func?我试过了

Func<void, void>

但无效。

3 个答案:

答案 0 :(得分:11)

您可以创建一个扩展方法来包装一个动作并返回一个虚拟值:

public static class ActionExtensions
{
    public static Func<T, T> ToFunc<T>(this Action<T> act)
    {
        return a => { act(a); return default(T) /*or a*/; };
    }
}

Action<?> act = ...;
SomeMethod(act.ToFunc());

如果您创建自己的Unit类型而不是使用object并返回null,则可能会更清楚。

答案 1 :(得分:3)

<强> .NET Fiddle

您正在寻找的是&#34;声明lambda&#34; msdn

语句lambda是在用大括号{}包装表达式(右侧)时。这允许使用多于1个语句。对于您的具体示例,您可以这样做:

void Main()
{
    Func<bool,bool> f = i => {SomeAction();return true;};
    Console.WriteLine(SomeMethod(f));
}

public T SomeMethod<T>( Func<T, T> f ) 
{
    return f(default(T));
}

public void SomeAction()
{
    Console.WriteLine("called");
}

输出

called
True

答案 2 :(得分:1)

您无法将Action变为Func。但是你可以打电话给Action中的Func。例如,像:

Action a = new Action<Foo>(f => { whatever });

Foo myFoo = ...;
Foo result = SomeMethod(new Func<Foo, Foo>(f => { a(myFoo); return myFoo; }));

(目前没有Visual Studio,但我认为你明白了。)