繁体   English   中英

C#如何在方法参数列表中声明lambda或匿名函数类型?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM