功能输入和输出的多态性

时间:2018-03-30 02:24:33

标签: f# polymorphism

输入的多态性是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。反思是对此的回答吗?

1 个答案:

答案 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 } 字段中提取序列化程序。