Если вы хотите восстановить нотацию Type.Prop.[args]
, вы можете определить простой объект для представления индексируемого свойства с помощью свойства Item
:
type IndexedProperty<'I, 'T>(getter, setter) =
member x.Item
with get (a:'I) : 'T = getter a
and set (a:'I) (v:'T) : unit = setter a v
type ObjWithStaticProperty =
static member StaticPropertyIndexed1 =
IndexedProperty((fun x -> 3), (fun x v -> ()))
ObjWithStaticProperty.StaticPropertyIndexed1.[0]
Это возвращает новый экземпляр IndexedProperty
каждый раз, поэтому может быть лучше его кэшировать. В любом случае, я думаю, что это довольно хороший трюк, и вы можете инкапсулировать некоторое дополнительное поведение в тип свойства.
Отступление: я думаю, что элегантное расширение для F # будет иметь первоклассных свойств , как у него первоклассных событий . (Например, вы можете создать свойства, которые автоматически поддерживают INotifyPropertyChange
только с одной строкой кода)