簡體   English   中英

F#為表達式創建自定義屬性

[英]F# Create custom attribute to expression

在F#中,如何創建自定義屬性以應用於表達式? 我到處尋找資源,但我一無所獲。

例如,屬性[<Entrypoint>]可以應用於某個表達式,因此編譯器可以推斷該表達式應該是類型array string -> int

如何創建自定義屬性以使用simillary?

要創建自定義屬性,只需聲明一個繼承自System.Attribute的類:

type MyAttribute() = inherit System.Attribute()

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

如您所見,將屬性應用於代碼單元時可以省略后綴“Attribute”。 (可選)您可以提供屬性參數或屬性:

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

這是一個更詳細地解釋自定義屬性的教程

但是 ,您無法使用自定義屬性來強制執行編譯時行為。 EntryPointAttribute特殊的 - 也就是說,F#編譯器知道它的存在並給予特殊處理。 F#中還有一些其他特殊屬性 - 例如, NoComparisonAttributeCompilationRepresentationAttribute等,但您無法告訴編譯器對您自己創建的屬性進行特殊處理。

如果你描述了你更大的目標(即你想要實現的目標),我相信我們能夠找到更好的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM