输入的多态性是solved使用功能惯用方法,现在期待为涉及JSON序列化程序的返回类型解决它,实际上需要知道记录的类型。< / p>
强制执行输入参数以使某些特定字段成为必需字段,并且只要字段成员存在,解决方案就允许传递不同类型。解决方案被称为SRTP或结构(或鸭)打字。
现在我遇到了一个障碍,这个函数本质上是一个Web服务调用,它根据传递的对象的类型返回最新的JSON模式。我只传递必填字段(注册,所有者,轮子),服务器返回原始强制数据和自定义字段,两种类型(Car,Truck)都有不同类型的JSON模式。
该块使用JSON序列化程序,需要知道要传递的对象的类型,并且类型必须硬编码才能序列化。
因此,在某种程度上,函数具有多态输入和输出。
type Car = {
Registration: string
Owner: string
Wheels: int
customAttribute1: string
customAttribute2: string
}
type Truck = {
Registration: string
Owner: string
Wheels: int
customField5: string
customField6: string
}
let inline someComplexFun v =
let owner = (^v: (member Owner: string)(v))
let registration = (^v: (member Registration: string)(v))
// send the mandatory fields to server to fetch rest of the custom fields.
use response = request.GetResponse() :?> HttpWebResponse
use reader = new StreamReader(response.GetResponseStream())
use memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(reader.ReadToEnd()))
(new DataContractJsonSerializer(typeof<Car>)).ReadObject(memoryStream) :?> Car
现在,如果传递卡车类型,最后一行基本上会改变
(new DataContractJsonSerializer(typeof<Truck>)).ReadObject(memoryStream) :?> Truck
注意: 现在如果使用不同的功能惯用方法有横向方法,我可以灵活地选择不同的路径。只要函数不仅可以接收和返回这两种特定类型。
P.S。反思是对此的回答吗?
答案 0 :(得分:0)
如有必要,您可以检查类型信息并传递该信息。由于您已经在使用typeof
,因此您也可以在v
上使用该type Vehicle = {
Registration: string
Owner: string
VehicleType: System.Type
}
let inline someComplexFun v =
let t = typeof<'v>
let owner = (^v: (member Owner: string)(v))
let registration = (^v: (member Registration: string)(v))
{Registration = registration; Owner = owner; VehicleType = t}
。如果我们保持在同一个例子中:
t
您可以使用VehicleType
标识要应用的序列化程序,或从import { injectIntl, intlShape } from 'react-intl';
ChildComponent.propTypes = {
intl: intlShape.isRequired
}
字段中提取序列化程序。