2017-06-28 5 views
3

In F #, wie kann ich ein benutzerdefiniertes Attribut für die Anwendung auf Ausdrücke erstellen? Ich suchte überall nach Ressourcen, aber ich fand nichts.F # Erstellen Sie ein benutzerdefiniertes Attribut für den Ausdruck

Für exemple Das Attribut [<Entrypoint>] kann bis zu einem gewissen Ausdruck angewendet werden, und durch die Folge der Compiler, dass die Expression ableiten kann, sollte vom Typ array string -> int sein.

Wie kann ich ein benutzerdefiniertes Attribut erstellen, um similary zu arbeiten?

Antwort

6

Um ein benutzerdefiniertes Attribut zu erstellen, einfach eine Klasse deklarieren, die von System.Attribute erbt:

type MyAttribute() = inherit System.Attribute() 

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

Wie Sie sehen können, kann das Suffix „Attribut“ weggelassen werden, wenn das Attribut Auftragseinheiten zu codieren. Optional können Sie Ihre Attribut Parameter oder Eigenschaften geben:

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

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

Zur Laufzeit können Sie Typen, Methoden und andere Codeeinheiten untersuchen, um zu sehen, welche ihnen angewendet werden Attribute und ihre Daten abzurufen:

[<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 erklären benutzerdefinierte Attribute im Detail.

Jedoch, Sie können benutzerdefinierte Attribute nicht verwenden, um das Verhalten bei der Kompilierung zu erzwingen. Die EntryPointAttribute ist spezielle - das heißt, der F # -Compiler weiß um seine Existenz und gibt ihm eine spezielle Behandlung. Es gibt einige andere spezielle Attribute in F # - zum Beispiel NoComparisonAttribute, CompilationRepresentationAttribute, etc., aber Sie können dem Compiler nicht sagen, dass er Attribute, die Sie selbst erstellt haben, speziell behandelt.

Wenn Sie Ihr größeres Ziel beschreiben (d. H. Was Sie erreichen wollen), werden wir sicher eine bessere Lösung finden.

+1

Ich frage mich, ob es für den Compiler möglich wäre, aus den Attributen zu schließen, gab es kein größeres Ziel. Aber ich wusste nicht, dass es spezielle Attribute gab, danke! –

Verwandte Themen