[英]C# How to declare lambda or anonymous function type in method argument list?
我不知道这是否可能在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采用参数,我也不需要参数。 所以行动似乎不是一个可行的候选人。 真的,我想要的只是一种内联“匿名块”概念的方式,只要签名是无效的(无效)。这样的事情:
namespace N {
interface MyInterface {
void doSomething(typeof(()=>) completionBlock);
}
}
但是lambda并没有C#中的类型。 他们至少有签名吗? 基本上,这有什么办法吗?
例如,在Objective-C中,块是NSBlock类型,即使它们的签名本身不容易访问,但是可以创建一个带有特定签名块的方法。 例如:
- (void)doSomething:(void(^)(void))completionBlock
这是一个采用没有参数且没有返回类型的块的方法,你可以像这样调用方法,例如:
[obj doSomething:^(){your block code}];
然后就是Action和Func。 但即使Action采用参数,我也不需要参数。 所以行动似乎不是一个可行的候选人。
如果使用Action
(不是Action<T>
),则不使用参数。
namespace N {
interface MyInterface {
void doSomething(Action completionBlock);
}
}
这允许你写:
yourInstance.doSomething(() => DoWhatever(foo));
或者,如果DoWhatever
void DoWhatever()
,只需:
yourInstance.doSomething(DoWhatever);
在您的案例中使用Action<T>
或Func<TResult>
或其中一个兄弟姐妹或仅使用Action
。
Action<...>
不返回Func<..., TResult>
所做的任何事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.