我有一个以Func
作为参数的参数方法
SomeType SomeMethod<T>( Func<T, T> f ) {...}
我想传递Action
而不必重载方法。但这会解决问题,您如何表示Action
作为Func
?我试过了
Func<void, void>
但无效。
答案 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,但我认为你明白了。)