Я пытаюсь создать Атрибут, который проверяет определенный экземпляр типа.Циркулярная ссылка и конструкторы
Для этого мне необходимо нанести ObjectInstance
на этот тип.
И мне нужно установить атрибут на члене этого типа.
Поэтому нам необходимо прибегнуть к ключевому слову and
для кругового определения.
Однако в следующем случае я получаю ошибку, что
Пользовательский атрибут должен вызывать конструктор объекта
На линии, отмеченной ниже.
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
Я попытался вручную вызова конструктора, например:
[<MyAttribute()>]
// or
[<new MyAttribute()>]
Но никто из них не принимаются системой.
Может ли гуру F # помочь мне здесь?
Это является возможным решением, но это совсем (мягко сказано) загрязнен. Спасибо! – Snake
Не утверждая, что это самое чистое решение :-) Позвольте мне добавить еще один. –
Мне нравится ваш новый обходной путь лучше. Я оставляю его открытым немного дольше, может быть, кто-то приходит с реальным решением. Если нет, то ваши очки. Я также подал ошибку в проекте FSharp на GitHub: https://github.com/fsharp/fsharp/issues/565 – Snake