2

在阅读 NSubstitute 教程时,我将用 C# 编写的示例转换为 VB.net 以了解其功能,但我需要您对这些(不相关的)语句的支持,尽管我非常小心,但我无法转换:

1.

calculator().Received().Add(1, Arg.Is(Of Integer)(function(x) new[] {-2,-5,-10}.Contains(x)))

2.

注意: foo 是从一个接口派生的对象,该接口具有一个名为“SayHello”的 void 方法

foo.When(x >= x.SayHello("World")).Do(x => counter++);

3.

calculator().When(x >= x.Add(-2, -2)).Do(x => { throw new Exception(); });

注意:引擎是从这个接口派生的对象:

public interface IEngine {
    event EventHandler Idling;
    event EventHandler<LowFuelWarningEventArgs> LowFuelWarning;
    event Action<int> RevvedAt;
}

4.

engine.Idling += (sender, args) => wasCalled = true;

5.

engine.Idling += Raise.EventWith(new object(), new EventArgs());

6.

engine.RevvedAt += rpm => revvedAt = rpm;

我希望在您的支持下,我能够自己转换剩余的语句。

先感谢您

迈克尔

4

2 回答 2

2

您似乎想要转换 Lambda 并添加事件处理程序。

来自 c# 的 Lambda

.Where(x => x.Foo = 1)
.Do(x => x.Bar())

翻译成

.Where(function(x) x.Foo = 1)
.Do(sub(x) x.Bar())

在 VB.Net 中,您必须考虑 Labda 是否实际执行功能或子程序并相应地对其进行编码。

在 C# 中添加事件

engine.Idling += MyEventHandler

VB.Net

AddHandler engine.Idling, AddressOf MyEventHandler

VB.Net让你像这样添加事件。删除事件由关键字完成RemoveHandler

于 2014-05-07T09:41:12.370 回答
1

要添加到 Jeroen 的答案,添加事件处理程序的一般格式是:

AddHandler someObject.SomeEvent, SomeDelegate

您可以使用AddressOf运算符创建一个引用命名方法的委托,但这不是唯一的方法。Lambda 还创建了一个委托,因此:

engine.Idling += (sender, args) => wasCalled = true;

变成这样:

AddHandler engine.Idling, Sub(sender, args) wasCalled = True

此外,这一行实际上并未添加事件处理程序:

engine.RevvedAt += rpm => revvedAt = rpm;

所以 AddHandler 不起作用。我自己从来没有做过,但我相信你需要这样做Delegate.Combine

engine.RevvedAt = [Delegate].Combine(engine.RevvedAt, Sub(rpm) revvedAt = rpm)
于 2014-05-07T09:57:44.893 回答