我有一个参数方法,需要一个 Func
作为一个论点
SomeType SomeMethod<T>( Func<T, T> f ) {...}
我想传递一个 Action
无需重载方法。但是这就解决了这个问题,你如何代表和 Action
作为一个 Func
?我试过了
Func<void, void>
但它无效。
我有一个参数方法,需要一个 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
。但你可以打电话给 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,但我认为你明白了。)