Я буду одобрять дизайн OO по покрытию кода и видеть, не могу ли я переместить те поля в класс, которому нужны они. Таким образом, я попытался бы видеть, могут ли те методы get и методы set быть удалены, как предложено прежде. методы get и методы set повреждающаяся инкапсуляция .
Для расширения F #, которое может быть вызвано из F #:
type System.String with
member x.Right(index) = x.Substring(x.Length - index)
Обратите внимание, что в бета-версии 1 это не приводит к способу расширения, совместимому с C #.
Для создания расширения методы, видимые в C # (но не используемые в качестве методов расширения в F #), см. ссылку в редактировании Брайана на исходное сообщение.
Я знаю, что это не совсем ответ на ваш вопрос, но на него стоит указать. В F # и других функциональных языках вы часто видите модули со статическими методами (например, модуль Seq), которые предназначены для объединения с другими функциями. Насколько я видел, методы экземпляра составить нелегко, и это одна из причин, по которой существуют эти модули. В случае этого расширения вы можете захотеть добавить функцию в модуль String.
module String =
let right n (x:string) =
if x.Length <= 2 then x
else x.Substring(x.Length - n)
Затем она будет использоваться так.
"test"
|> String.right 2 // Resulting in "st"
["test"; "test2"; "etc"]
|> List.map (String.right 2) // Resulting in ["st"; "t2"; "tc"]
Хотя в этом случае метод расширения не будет намного больше кода.
["test"; "test2"; "etc"]
|> List.map (fun x -> x.Right 2)
]