簡體   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