【发布时间】:2014-06-24 08:29:29
【问题描述】:
我不知道这在 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 也需要一个参数,而我不需要任何参数。因此,Action 似乎不是一个可行的候选人。真的,我想要的只是一种内联“匿名块”概念的方法,只要签名是 void(void)。像这样:
namespace N {
interface MyInterface {
void doSomething(typeof(()=>) completionBlock);
}
}
但是 lambda 在 C# 中并没有真正的类型。他们至少有签名吗? 基本上,有没有办法解决这个问题?
例如,在 Objective-C 中,块的类型为 NSBlock,即使它们的签名本身并不容易访问,但可以创建一个方法来获取具有特定签名的块。例如:
- (void)doSomething:(void(^)(void))completionBlock
将是一个接受没有参数和返回类型的块的方法,并且您可以像这样调用该方法,例如:
[obj doSomething:^(){your block code}];
【问题讨论】:
-
那里是 parameterless
Action()delegate。您可以使用吗?
标签: c#