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

3

我不知道在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(void)即可。类似于这样:
namespace N {
  interface MyInterface {
    void doSomething(typeof(()=>) completionBlock);
  }
}

但是在C#中,Lambda表达式并没有真正的类型。它们至少具有签名吗?基本上,有没有任何方法可以解决这个问题?

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

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

将会有一种方法,需要一个没有参数和返回类型的块,并且您可以像这样调用该方法:

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

3
有一个无参数的 Action() 委托。对于你的使用来说可以吗? - Chris Sinclair
2个回答

5
然后就有了Action和Func。但即使Action也需要一个参数,而我不想要参数。因此,Action似乎不是一个可行的选择。 如果使用Action(而不是Action),它就不需要参数。
namespace N {
  interface MyInterface {
    void doSomething(Action completionBlock);
  }  
}

这使您可以编写如下内容:
yourInstance.doSomething(() => DoWhatever(foo));

或者,如果DoWhatevervoid DoWhatever(),只需执行以下操作:
yourInstance.doSomething(DoWhatever);

2
使用 Action<T>Func<TResult> 或它们的任意一个兄弟姐妹,或者在您的情况下只使用ActionAction<...>不返回任何内容,而Func<..., TResult>则会返回。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接