我正在创建一个帮助器来过滤流/可观察的特定类型的对象。这是要点:
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));
对于上面标记的行,抛出以下异常:
InvalidCastException:指定的强制转换无效。
我曾尝试使用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>
的辅助函数,它基本上就是为你做的地方和演员。