我不知道在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需要一个参数,而我不想要任何参数。所以Action似乎不是一个可行的选择。实际上,我只想要一种方法来内联“匿名块”,只要签名为void(void)即可。类似于这样:
namespace N {
interface MyInterface {
void doSomething(typeof(()=>) completionBlock);
}
}
但是在C#中,Lambda表达式并没有真正的类型。它们至少具有签名吗?基本上,有没有任何方法可以解决这个问题?
例如,在Objective-C中,块的类型为NSBlock,即使它们的签名本身不容易访问,但可以创建一个带有特定签名的块的方法。例如:
- (void)doSomething:(void(^)(void))completionBlock
将会有一种方法,需要一个没有参数和返回类型的块,并且您可以像这样调用该方法:
[obj doSomething:^(){your block code}];
Action()
委托。对于你的使用来说可以吗? - Chris Sinclair