[英]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,则可能更清楚。
你要找的是一个“声明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.