我不知道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类型,因为它与上述类型冲突,如果在同一名称空间内。
然后是Action和Func。但即使Action采用参数,我也不需要参数。所以行动似乎不是一个可行的候选人。实际上,只要签名是无效的(void),我想要的只是一种内联"匿名块概念的方法。像这样:
namespace N {
interface MyInterface {
void doSomething(typeof(()=>) completionBlock);
}
}
但是Lambda并没有真正拥有C#类型。他们至少有签名吗? 基本上,这有什么办法吗?
例如,在Objective-C中,块的类型为NSBlock,即使它们的签名本身不易访问,但是可以创建一个带有特定签名的块的方法。例如:
- (void)doSomething:(void(^)(void))completionBlock
这是一个采用没有参数且没有返回类型的块的方法,你可以像这样调用方法,例如:
[obj doSomething:^(){your block code}];
答案 0 :(得分:4)
然后是Action和Func。但即使Action采用参数,我也不需要参数。因此,动作似乎不是一个可行的候选人。
如果您使用Action
(不是Action<T>
),则不会使用参数。
namespace N {
interface MyInterface {
void doSomething(Action completionBlock);
}
}
这允许你写:
yourInstance.doSomething(() => DoWhatever(foo));
或者,如果DoWhatever
是void DoWhatever()
,则只需:
yourInstance.doSomething(DoWhatever);
答案 1 :(得分:2)
使用Action<T>
或Func<TResult>
或其中一个兄弟姐妹,或仅使用Action
。
Action<...>
不会返回Func<..., TResult>
所做的任何内容。