c#如何在方法参数列表中声明lambda或匿名函数类型
本文关键字:lambda 类型 函数 声明 方法 列表 参数 | 更新日期: 2023-09-27 18:10:04
我不知道这在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)。像这样:
namespace N {
interface MyInterface {
void doSomething(typeof(()=>) completionBlock);
}
}
但是lambda在c#中并没有真正的类型。至少他们有签名吧?基本上,有什么办法可以解决这个问题吗?
例如,在Objective-C中,block的类型是NSBlock,尽管它们的签名本身不容易访问,但是可以创建一个方法来获取带有特定签名的block。例如:- (void)doSomething:(void(^)(void))completionBlock
将是一个接受一个没有参数和返回类型的块的方法,您可以这样调用该方法,例如:
[obj doSomething:^(){your block code}];
还有Action和Func。但即使是Action也需要参数,而我不想要参数。所以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>
相同的东西