【问题标题】:C# How to declare lambda or anonymous function type in method argument list?C# 如何在方法参数列表中声明 lambda 或匿名函数类型?
【发布时间】:2014-06-24 08:29:29
【问题描述】:

我不知道这在 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 也需要一个参数,而我不需要任何参数。因此,Action 似乎不是一个可行的候选人。真的,我想要的只是一种内联“匿名块”概念的方法,只要签名是 void(void)。像这样:

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

但是 lambda 在 C# 中并没有真正的类型。他们至少有签名吗? 基本上,有没有办法解决这个问题?

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

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

将是一个接受没有参数和返回类型的块的方法,并且您可以像这样调用该方法,例如:

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

【问题讨论】:

标签: c#


【解决方案1】:

然后是动作和功能。但即使 Action 需要一个参数,我也不需要任何参数。所以 Action 似乎不是一个可行的候选者。

如果你使用Action(不是Action<T>),它不带参数。

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

这允许你写:

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

或者,如果 DoWhatevervoid DoWhatever(),那么:

yourInstance.doSomething(DoWhatever);

【讨论】:

    【解决方案2】:

    在您的情况下使用Action<T>Func<TResult> 或他们的兄弟姐妹之一或仅使用Action

    Action<...> 不会像Func<..., TResult> 那样返回任何东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-16
      • 2015-09-11
      • 2012-11-19
      相关资源
      最近更新 更多