У меня есть несколько серверных объектов с иерархией наследования, например:
[<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‹C›) кандидаты: [|"(GetObject: System.String -> Microsoft.FSharp.Control.FSharpAsync` 1‹.C›)"|]
Кажется, что он ищет тип .C вместо типа C (акцент на ведущей точке)
В чем причина такого поведения? Есть ли способ получить экземпляр моего объекта с сервера без указания его конкретного типа?
Обновлять
Интересно, что это сработает, если я заменю вызов RPC клиентским методом следующим образом:
[<JavaScript>]
let GetObjectClient (arg : string) : A =
(upcast C() : A)
Я предполагаю, что есть проблемы с преобразованием объекта на стороне сервера в соответствующий клиентский аналог. Тем не менее я понятия не имею, как преодолеть это