繁体   English   中英

在C#中作为Func操作

[英]Action as Func in C#

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

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

我想传递一个Action而不必重载该方法。 但这就解决了问题,你如何表现和Action作为一个Func 我试过了

Func<void, void>

但它无效。

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

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,则可能更清楚。

.NET Fiddle

你要找的是一个“声明lambda” 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

您无法将Action转换为Func 但是你可以在Func中包含对Action的调用。 例如,类似于:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM