0

您将如何使用 Reactive Extensions 构建一个简单的模拟引擎?例如,假设您有一个Motor具有属性的类IsPoweredSpeed. 您希望通过以每秒 10 RPM 的速度从 0 RPM 上升到 1000 RPM 持续 100 秒来对IsPowered从 false 变为 true做出反应。Speed

稍微抽象一下,假设您想提供一个可插入的 API,其中类及其属性事先不知道。取而代之的是,模拟引擎获得了可观察到的属性变化流,通过创建额外的属性变化来做出反应,其中许多变化是利用 Rx 随时间增量发生的。这样的 API 会是什么样子?

4

1 回答 1

0

模拟 API 需要一个表示属性更改的类型和一个具有传入和传出IObservable<T>更改流的模拟方法。模拟引擎的实现将包含对传入属性更改做出反应以更新输出流的规则。

类型是这样的(尽管结构可能比类更好):

class PropertyChange
{
    public PropertyChange(string name, object value) { Name = name; Value = value; }
    public string Name { get; private set; }
    public object Value { get; private set; }
}

模拟方法如下所示。为了演示多个规则,此代码预设了一个IsLightOn简单地跟踪的属性IsPowered

IObservable<PropertyChange> Simulate(IObservable<PropertyChange> incomingChanges)
{
    var isLightOnRule =
        from c in incomingChanges
        where c.Name == "IsPowered"
        select new PropertyChange("IsLightOn", c.Value);

    var ramp = Observable.Generate(0, speed => (speed <= 1000), speed => speed + 10, speed => new PropertyChange("Speed", speed), _ => TimeSpan.FromSeconds(1));
    var speedRule = incomingChanges
        .Where(c => c.Name == "IsPowered" && (bool)c.Value)
        .SelectMany(ramp);

    // Add more rules here.

    return Observable.Merge(isLightOnRule, speedRule /* merge more rules here */);
}
于 2012-05-03T20:39:07.847 回答