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

时间:2014-06-24 00:22:42

标签: c#

我不知道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采用参数,我也不需要参数。所以行动似乎不是一个可行的候选人。实际上,只要签名是无效的(void),我想要的只是一种内联"匿名块概念的方法。像这样:

namespace N {
  interface MyInterface {
    void doSomething(typeof(()=>) completionBlock);
  }
}

但是Lambda并没有真正拥有C#类型。他们至少有签名吗? 基本上,这有什么办法吗?

例如,在Objective-C中,块的类型为NSBlock,即使它们的签名本身不易访问,但是可以创建一个带有特定签名的块的方法。例如:

- (void)doSomething:(void(^)(void))completionBlock

这是一个采用没有参数且没有返回类型的块的方法,你可以像这样调用方法,例如:

[obj doSomething:^(){your block code}];

2 个答案:

答案 0 :(得分:4)

  

然后是Action和Func。但即使Action采用参数,我也不需要参数。因此,动作似乎不是一个可行的候选人。

如果您使用Action(不是Action<T>),则不会使用参数。

namespace N {
  interface MyInterface {
    void doSomething(Action completionBlock);
  }  
}

这允许你写:

yourInstance.doSomething(() => DoWhatever(foo));

或者,如果DoWhatevervoid DoWhatever(),则只需:

yourInstance.doSomething(DoWhatever);

答案 1 :(得分:2)

使用Action<T>Func<TResult>或其中一个兄弟姐妹,或仅使用Action

Action<...>不会返回Func<..., TResult>所做的任何内容。