我有一些具有继承层次结构的服务器端对象,例如:
[<JavaScriptExport>]
type [<AbstractClass>] A() = ...
[<JavaScriptExport>]
type [<AbstractClass>] B() =
inherit A()
[<JavaScriptExport>]
type C() =
inherit B()
以上对象具有某些字段和方法,为简洁起见,我将其省略。所有这些都可以编译为javascript-我没有收到任何构建错误。
我有一个RPC,它将返回服务器端创建的此类对象的实例:
module Remoting =
[<Rpc>]
let GetObject (arg: string) : Async<A> =
async {
return (upcast C() : A)
}
当我调用rpc并在浏览器中调试相关的javascript时,我看到重新设置的对象是{}
。我在日志中看不到任何服务器端错误。
如果我将Rpc的签名更改为具体类型GetObject (arg: string) : Async<C>
,则会在服务器上收到错误消息:
System.Exception:无法加载方法(GetObject:System.String-> Microsoft.FSharp.Control.FSharpAsync`1
)候选:[|“(GetObject:System.String-> Microsoft.FSharp.Control .FSharpAsync`1 <.C>)“ |]
似乎正在寻找类型.C
而不是类型C
(在前导点上加强调号)
此行为的原因是什么?有没有一种方法可以从服务器获取我的对象实例而无需指定其具体类型?
有趣的是,如果我用这样的客户端方法替换RPC调用,它将起作用:
[<JavaScript>]
let GetObjectClient (arg : string) : A =
(upcast C() : A)
我想在将服务器端对象转换为其对应的客户端副本时会遇到问题。仍然我不知道如何克服这个问题