C# IObservable的强制转换无效,运行时异常
我正在创建一个助手来过滤流/可观察对象中特定类型的对象。要点如下:C# IObservable的强制转换无效,运行时异常,c#,generics,casting,system.reactive,unirx,C#,Generics,Casting,System.reactive,Unirx,我正在创建一个助手来过滤流/可观察对象中特定类型的对象。要点如下: public interface IGameAction { } // Example action public struct OpenDoorAction : IGameAction { } // In Store.cs public Subject<IGameAction> Actions; public IObservable<T> When<T>() where T : IGa
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);
}
公共接口IGameAction{}
//示范行动
公共结构OpenDoorAction:IGameAction{}
//In-Store.cs
公共主体诉讼;
public IObservable When()其中T:IGameAction
{
//这里例外
返回(IObservable)this.Actions.Where(action=>action是T);
}
这样使用时:
this.When<OpenDoorAction>()
.Subscribe(a => Debug.Log(a));
this.When()
.Subscribe(a=>Debug.Log(a));
针对上面标记的行引发以下异常:
InvalidCastException:指定的强制转换无效
我已经尝试为IGameAction
和实现者(例如OpenDoorAction
)中的一个或两个使用类。我不明白为什么我需要转换为IObservable
,但是没有它,编译器说没有从IObservable
到IObservable
的隐式转换<代码>主题实现IObservable
FWIW这是在Unity3D中使用的这是因为在
IObservable
和IObservable
之间没有直接转换,即使您已指定了约束
您应该改为在流中重新转换各个项目:
返回this.Actions.Where(action=>action是T.Cast()代码>
然后,您的返回值将是正确类型的IObservable
正如mjwills
在评论中指出的那样,存在一个IObservable.OfType
的助手函数,它基本上只为您执行where和cast操作。当然应该!这基本上只是为你做了Where
和Cast
。啊哈,这很有意义!我还必须指定源类型,因此this.Actions.OfType()
。对于好奇的人来说,.Cast
做了一些类似于的事情。选择(a=>(T)a)
,这也是问题的“解决方案”。谢谢