2014-06-24 25 views
3

我不知道這是否可能在C#中。但這是我想要做的: 一個接口,它聲明一個方法的完成塊/回調/ lambda /無論你想調用它。看起來很簡單。但是,這是第一次嘗試:C#如何在方法參數列表中聲明lambda或匿名函數類型?

namespace N { 
    interface MyInterface { 
    delegate void CompletionBlock(); 
    void doSomething(CompletionBlock completionBlock); 
    } 
} 

但接口無法聲明委託。好的,這個怎麼樣?

namespace N { 
    public delegate void CompletionBlock(); 
    interface MyInterface { 
    void doSomething(CompletionBlock completionBlock); 
    } 
} 

當然可以,但現在說,我聲明另一種類型的CompletionBlock,例如一個參數。我不能調用CompletionBlock類型,因爲它會與上面的類型衝突,如果在相同的名稱空間內。

然後有行動和功能。但即使行動採取一個參數,我不想要參數。所以行動似乎不是一個可行的候選人。真的,我想,是隻要內嵌匿名塊」概念的一種方式,簽名是無效的(無效)事情是這樣的:

namespace N { 
    interface MyInterface { 
    void doSomething(typeof(()=>) completionBlock); 
    } 
} 

不過Lambda表達式真的沒有在C#中的類型。難道他們至少有簽名? 基本上是沒有解決這個辦法嗎?

在Objective-C,例如,塊型NSBlock的,即使他們的簽名本身是不容易接近,但一個可以創建一種採用具有特定簽名的塊的方法,例如:

- (void)doSomething:(void(^)(void))completionBlock 

將是採用無參數,無返回值類型塊的方法,而且你調用該方法,像這樣,例如:

[obj doSomething:^(){your block code}]; 
+3

有_is_一個[參數的'行動()'委託(HTTP: //msdn.microsoft.com/en-us/library/system.action%28v=vs.110%29.aspx)。你的用法可以嗎? –

回答

4

然後是Action和Func。但即使行動採取一個參數,我不想要參數。所以行動似乎不是一個可行的候選人。

如果您使用Action(而不是Action<T>),它不帶參數。

namespace N { 
    interface MyInterface { 
    void doSomething(Action completionBlock); 
    } 
} 

這允許你寫:

yourInstance.doSomething(() => DoWhatever(foo)); 

或者,如果DoWhatevervoid DoWhatever(),只是:

yourInstance.doSomething(DoWhatever); 
2

使用Action<T>Func<TResult>或他們的兄弟姐妹中的一個或只是Action在你的情況。

Action<...>不會返回任何東西,如Func<..., TResult>所做的。