Позиционные аргументы F # в атрибутах - PullRequest
1 голос
/ 16 марта 2011

Я пытаюсь создать атрибут в F # с позиционными аргументами, но все время терпит неудачу.

type ColumnAttribute(?index:int,?name:string) =
    inherit Attribute()
    let mutable index = index
    let mutable name = name
    member x.Index 
        with get() = index
        and set value = index <- value
        member x.Name 
        with get() = name
        and set value = name <- value

type Substance = {
    [<Column(Index=1)>] Name : string
    [<Column(Index=0)>] Id : int
    [<Column(Name="sequence")>] Sequence : string
}

Я пробовал несколько разных подходов, но это самый близкий, которым я закончил.

Ответы [ 3 ]

4 голосов
/ 16 марта 2011

Есть 2 проблемы, которые я вижу с вашим кодом

  1. Чтобы это работало, вам нужно определить конструктор без аргументов для ColumnAttribute.
  2. Типы Index и Name - int option и string option соответственно, но вам нужно, чтобы они были int и string.

Попробуйте следующее

type ColumnAttribute(index:int option,name:string option) =     
    inherit Attribute()     
    let mutable index = index
    let mutable name = name
    new () = ColumnAttribute (None, None)
    member x.Index          
        with get() = match index with | Some i -> i | None -> 0
        and set value = index <- Some value         
    member x.Name          
        with get() = match name with | Some n -> n | None -> ""
        and set value = name <- Some value  

type Substance = {     
    [<Column(Index=1)>] Name : string     
    [<Column(Index=0)>] Id : int     
    [<Column(Name="sequence")>] Sequence : string }
2 голосов
/ 16 марта 2011

Это работает:

type ColumnAttribute() =
    inherit System.Attribute()
    let mutable index = 0
    let mutable name = ""
    member x.Index 
        with get() = index
        and set value = index <- value
    member x.Name 
        with get() = name
        and set value = name <- value

type Substance = {
    [<Column(Index=1)>] Name : string
    [<Column(Index=0)>] Id : int
    [<Column(Name="sequence")>] Sequence : string
}

Атрибуты уже поддерживают синтаксис установщика свойств, аналогичный именованным аргументам. Чтобы получить то, что вы хотите, используйте конструктор без параметров и полагайтесь на синтаксис атрибута вместо именованных аргументов (которые в любом случае плохо работают с атрибутами, потому что они выводятся как option s ..., которые не подходят как константные выражения).

0 голосов
/ 16 марта 2011

Вот, пожалуйста:

open System

type ColumnAttribute() =
    inherit Attribute()
    let mutable index = 0
    let mutable name = ""
    member x.Index         
        with get() = index        
        and set value = index <- value        
    member x.Name         
        with get() = name        
        and set value = name <- value

type Substance = {    
    [<Column(Index=1)>] Name : string    
    [<Column(Index=0)>] Id : int    
    [<Column(Name="sequence")>] Sequence : string
}

Обратите внимание, что дополнительные параметры (например, ?index) в вашей первоначальной попытке вызывали, например, типы. int option вместо int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...