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.
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! –