2017-06-28 12 views
3

F#では、式に適用するのカスタム属性を作成するにはどうすればよいですか?私はどこからでもリソースを探しましたが、何も見つかりませんでした。F#式にカスタム属性を作成する

例 属性[<Entrypoint>]は一部の式に適用できるため、コンパイラは式のタイプがarray string -> intであることを推測できます。

simillaryを使用するカスタム属性を作成する方法を教えてください。カスタム属性を作成するには

答えて

6

は、単にSystem.Attributeから継承したクラスを宣言:あなたが見ることができるようにコード単位に属性を適用するとき

type MyAttribute() = inherit System.Attribute() 

[<My>] 
let f x = x+1 

を、接尾辞「属性」を省略することができます。

type MyAttribute(x: string) = 
    inherit System.Attribute() 
    member val Y: int = 0 with get, set 

[<My("abc", Y=42)>] 
let f x = x+1 

実行時には、あなたがそれらに適用される属性を参照する型、メソッド、およびその他のコード単位を検査することができ、そのデータを取得するために:

を必要に応じて、あなたの属性パラメータや特性を与えることができます
[<My("abc", Y=42)>] 
type SomeType = A of string 

for a in typeof<SomeType>.GetCustomAttributes(typeof<MyAttribute>, true) do 
    let my = a :?> MyAttribute 
    printfn "My.Y=%d" my.Y 

// Output: 
> My.Y=42 

Here is a tutorialより詳細にカスタム属性を説明します。

ただし、カスタム属性を使用してコンパイル時の動作を強制することはできません。 EntryPointAttribute特別なです。つまり、F#コンパイラはその存在を知り、特別な扱いをしています。 F#には他にもいくつかの特殊属性があります。たとえば、NoComparisonAttribute,などですが、自分で作成した属性に特別な処理を加えるようにコンパイラに指示することはできません。

大きな目標(達成しようとしている目標)を記述すると、より良い解決策を見つけることができます。

+1

コンパイラが属性から推論することが可能かどうかは、大きな目標はありませんでした。しかし、私は特別な属性があったことを知らなかった、ありがとう! –

関連する問題