3

因此,非常过时的 Hands-on-Labs (HoL) 使用了RemoveTimestamp在以后的版本中删除的方法。我不完全确定它的行为应该是什么。从 HoL 提供了这个扩展方法:

public static IObservable<T> LogTimestampedValues<T>(this IObservable<T> source, 
    Action<Timestamped<T>> onNext)
{
    return source.Timestamp().Do(onNext).RemoveTimestamp();
}

有没有替代品,或者有人知道这种方法的新操作/预期行为吗?Timestamp还存在。

4

2 回答 2

3

您可以自己定义扩展方法,通过调用扩展方法手动删除Timestamped包装器并从实例返回属性:SelectValueTimestamped

public static IObservable<T> LogTimestampedValues<T>(this IObservable<T> source, 
    Action<Timestamped<T>> onNext)
{
    // Validate parameters.
    if (source == null) throw new ArgumentNullException("source");
    if (onNext == null) throw new ArgumentNullException("onNext");

    // Timestamp, call action, then unwrap.
    return source.Timestamp().Do(onNext).Select(t => t.Value);
}

然而,为了真正有效,你真的想定义一个重载,它接受一个IScheduler实现并调用Timestamp扩展方法重载

public static IObservable<T> LogTimestampedValues<T>(this IObservable<T> source, 
    Action<Timestamped<T>> onNext, IScheduler scheduler)
{
    // Validate parameters.
    if (source == null) throw new ArgumentNullException("source");
    if (onNext == null) throw new ArgumentNullException("onNext");
    if (scheduler == null) throw new ArgumentNullException("scheduler");

    // Timestamp, call action, then unwrap.
    return source.Timestamp(scheduler).Do(onNext).Select(t => t.Value);
}

您想要这样做,因为您可能有一个特定的调度程序希望日志记录使用。

如果您没有传入IScheduler实现,那么初始扩展方法只不过是扩展方法的一个薄包装器Do并没有提供太多价值。

于 2012-12-17T16:04:42.203 回答
2

多田!

public static IObservable<T> RemoveTimestamp<T>(this IObservable<Timestamped<T>> This)
{
    return This.Select(x => x.Value);
}
于 2012-12-17T20:20:29.807 回答