属性の定義
F#での属性の定義に関する情報って何か少なくない・・・?
気のせいでしょうか。
まあC#とほとんど変わらないのですが、一応例を残しておこうと思います。
open System // // サンプル属性 // [<AttributeUsage(AttributeTargets.All)>] // こんな属性を付けよう type InformationAttribute(summary : string) = inherit System.Attribute() // こんなクラスを継承しよう member self.Summary = summary // 属性を取ってくる関数のサンプル let info (t : Type) = let f (t : Reflection.MemberInfo)= t.GetCustomAttributes(typeof<InformationAttribute>, false) |> Array.map (fun x -> x :?> InformationAttribute) |> Array.iter (fun x -> printfn "%s : %s" t.Name x.Summary) f t Array.iter f (t.GetMembers ()) printf "\n" // つくった属性を付けてみます [<Information("死んだじいちゃんが大事にしていたクラスです。")>] type AttrTestClass(x) = [<Information("貧弱なフィールドです") ; DefaultValue>] val mutable MyVal : int [<Information("繊細なメソッドです。")>] member self.MyMethod () = () [<Information("大胆なプロパティです。")>] member self.MyProperty = x [<Information("紳士的なenumです")>] type AttrTestEnum = XXX = 1 | YYY = 2 | ZZZ = 3
そして、例えば対話環境で以下のようにしゃべってみます。
> info typeofVS上では「///」によるXMLコメントのほうが便利だけども、対話環境で使うことを目的としたスクリプトにはこんな属性を付けてやってもいいかもしれません。;;
AttrTestClass : 死んだじいちゃんが大事にしていたクラスです。
MyMethod : 繊細なメソッドです。
MyProperty : 大胆なプロパティです。
MyVal : 貧弱なフィールドですval it : unit = ()
> info typeof;;
AttrTestEnum : 紳士的なenumですval it : unit = ()
いらないですね。そうですね。わかりました。すいません。