Un provider di tipi può imitare una classe anonima?

0

Sto lavorando alla creazione di un sito Web utilizzando il modello F # MVC 5 e ho notato che il creatore del modello utilizza tipi dichiarati formalmente per i valori predefiniti del percorso. In VB.Net e C #, questo è tipicamente fatto con classi anonime, ma queste non esistono in F # il mio attuale lavoro è di usare un oggetto Expando, come questo:

[<RequireQualifiedAccess>]
module RouteConfig =

    let private createDefaults (propValuePairs : seq<string * obj>) : obj =
        let defaults = ExpandoObject() :> IDictionary<string,obj>
        propValuePairs |> Seq.iter (fun (key,value) -> defaults.Add(key,value) )
        box defaults  

    /// create a pair, boxing the second item
    let inline private (=>) (key : string) value = key, box value

    let RegisterWebApi =
        Action<_> (fun (config: HttpConfiguration) ->
            // Configure routing
            config.MapHttpAttributeRoutes()
            config.Routes.MapHttpRoute(
                "DefaultApi", // Route name
                "api/{controller}/{id}", // URL with parameters
                createDefaults [ "controller" => "{controller}"; 
                                 "id" => RouteParameter.Optional]
            ) |> ignore

            // Configure serialization
            config.Formatters.XmlFormatter.UseXmlSerializer <- true
            config.Formatters.JsonFormatter.SerializerSettings.ContractResolver
                <- Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()

            // Additional Web API settings        
        )

    let RegisterRoutes(routes:RouteCollection) =

        routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            createDefaults [ "controller" => "Home" ; 
                             "action" => "Index"; 
                             "id" => UrlParameter.Optional; ]
        ) |> ignore

Mi sto principalmente chiedendo se i provider di tipi possono fare qualcosa di simile in fase di compilazione anziché in runtime.

    
posta Christopher Stevenson 03.08.2014 - 06:45
fonte

0 risposte

Leggi altre domande sui tag