Sto provando a creare un attributo che convalida una determinata istanza di un tipo.Riferimento circolare e costruttori
Per fare questo devo trasmettere il ObjectInstance
a quel tipo.
E ho bisogno di impostare l'attributo sul membro di quel tipo.
Quindi dobbiamo ricorrere alla parola chiave and
per la definizione circolare.
Tuttavia nel seguente caso ottengo l'errore che
un attributo personalizzato deve invocare un costruttore di oggetto
Sulla linea tracciata qui sotto.
namespace Test
open System
open System.ComponentModel.DataAnnotations
[<AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)>]
type MyAttribute() =
class
inherit ValidationAttribute()
override this.IsValid (value: Object, validationContext: ValidationContext) =
match validationContext.ObjectInstance with
| :? MyClass as item ->
// TODO more validation
ValidationResult.Success
| _ ->
new ValidationResult("No no no")
end
and MyClass(someValue) =
[<Required>]
[<Range(1, 7)>]
//vvvvvvvvvvvvvvv
[<MyAttribute>]
//^^^^^^^^^^^^^^^
member this.SomeValue : int = someValue
Ho provato a invocare manualmente il costruttore, come ad esempio:
[<MyAttribute()>]
// or
[<new MyAttribute()>]
Ma nessuno di loro è accettato dal sistema.
Un guru del F # può aiutarmi qui?
Questa è una possibile soluzione, ma è abbastanza (eufemismo) sporca. Grazie! – Snake
Non sostenere che questa sia la soluzione più pulita :-) Lascia che ne aggiunga un'altra. –
Mi piace di più la tua nuova soluzione. Lascio aperto ancora un po ', forse qualcuno arriva con una soluzione reale. In caso contrario, i punti sono tuoi. Ho anche archiviato un bug sul progetto FSharp su GitHub: https://github.com/fsharp/fsharp/issues/565 – Snake