Ich versuche, ein Attribut zu erstellen, die eine bestimmte Instanz eines Typs überprüft.Circular Referenz und Konstruktoren
Um dies zu tun, muss ich die ObjectInstance
auf diesen Typ zu werfen.
Und ich muss das Attribut für das Mitglied dieses Typs festlegen.
Also müssen wir auf das Schlüsselwort and
für die zirkuläre Definition zurückgreifen.
jedoch im folgenden Fall erhalte ich die Fehlermeldung, dass
Ein benutzerdefiniertes Attribut ein Objekt Konstruktor
Auf der Linie unten markiert aufrufen müssen.
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
Ich habe versucht Aufruf manuell den Konstruktor, wie zum Beispiel:
[<MyAttribute()>]
// or
[<new MyAttribute()>]
Aber keiner von ihnen werden vom System akzeptiert.
Kann ein F # Guru mir hier helfen?
, dass eine mögliche Lösung ist, aber es ist ganz (Untertreibung) verschmutzt. Vielen Dank! – Snake
Nicht behaupten, das ist die sauberste Lösung :-) Lassen Sie mich ein weiteres hinzufügen. –
Ich mag Ihre neue Workaround besser. Ich lasse es etwas länger offen, vielleicht kommt jemand mit einer echten Lösung. Wenn nicht, sind die Punkte deine. Ich habe auch einen Fehler auf dem FSharp-Projekt auf GitHub: https://github.com/fsharp/fsharp/issues/565 – Snake