es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Atributo personalizado en los campos de registro F#

Estoy tratando de declarar un atributo personalizado en un registro e intentando leerlo. Parece que no está funcionando. Por favor, aconseje.

“`text
// Atributo personalizado para campos de registro
[<attributeusage(attributetargets.field)>]
type Name(x: string) =
inherit Attribute()
member _.value = x

// Tipo de registro
type User =
{ [<name("id")>]
Id: int
[<name("email")>]
Email: string
[<name("organization_id")>]
OrganizationId: option<string> }

// Intentando leer el atributo. Esto no está funcionando. Aquí obtengo <null>.
let parse () =
FSharpType.GetRecordFields(typeof<user>)
|> Array.map (fun p -> p.Name, p.GetCustomAttribute(typeof<name>, false))
|> Array.iter (fun (t, a) -> printfn "%s : %A" t a)
“`</name(“organization_id”)></name(“email”)></name(“id”)></attributeusage(attributetargets.field)>

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el atributo personalizado no se está leyendo correctamente en el código proporcionado. Un posible problema podría ser que el uso del atributo se haya establecido para aplicar solo a campos, pero los campos de registro en el tipo User son en realidad propiedades.

    Para solucionar esto, se debe actualizar la declaración de AttributeUsage para incluir AttributeTargets.Property:

    [<attributeusage(attributetargets.field |="" attributetargets.property)="">]
    type Name(x: string) =
        inherit Attribute()
        member _.value = x
    

    Alternativamente, los campos de registro de User se pueden cambiar a campos en lugar de propiedades:

    type User =
        { [<name("id")>]
          mutable Id: int
          [<name("email")>]
          mutable Email: string
          [<name("organization_id")>]
          mutable OrganizationId: option<string> }
    

    Una vez resuelto esto, la función parse() debería leer correctamente los valores de atributos personalizados para cada campo/propiedad en el registro User.</name(“organization_id”)></name(“email”)></name(“id”)></attributeusage(attributetargets.field>

Comments are closed.