我正在创建一个帮助程序来过滤流/可观察对象中的特定类型的对象。这是要点:
public interface IGameAction { }
// Example action
public struct OpenDoorAction : IGameAction { }
// In Store.cs
public Subject<IGameAction> Actions;
public IObservable<T> When<T>() where T : IGameAction
{
// Exception here
return (IObservable<T>)this.Actions.Where(action => action is T);
}
当像这样使用时:
this.When<OpenDoorAction>()
.Subscribe(a => Debug.Log(a));
对于上面标记的行,将引发以下异常:
无效强制转换异常:指定的强制转换无效。
我尝试过为IGameAction
和实现器中的任何一个和两个使用类(例如。OpenDoorAction
)。我不明白为什么我需要强制转换来IObservable<T>
,但是没有它,编译器说没有从IObservable<IGameAction>
到IObservable<T>
的隐式强制转换。Subject
实现IObservable
.
FWIW 这是使用 UniRx 的 Unity3D
这是因为即使指定了约束,IObservable<IGameAction>
和IObservable<T>
之间也没有直接强制转换。
相反,您应该重新转换流中的各个项目:
return this.Actions.Where(action => action is T).Cast<T>();
然后,您的返回值将是正确的类型的 IObservable。
正如mjwills
在评论中指出的那样,存在IObservable<T>.OfType<T2>
的辅助函数,它基本上只是为您执行位置和强制转换。