[英]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.