gpt4 book ai didi

F#创建表达式的自定义属性

转载 作者:行者123 更新时间:2023-12-04 10:47:22 27 4
gpt4 key购买 nike

在F#中,如何创建自定义属性应用于表达式?我到处寻找资源,但没有发现任何东西。

举个例子
可以将[<Entrypoint>]属性应用于某些表达式,结果,编译器可以推断出该表达式应为array string -> int类型。

如何创建自定义属性以进行类似操作?

最佳答案

要创建自定义属性,只需声明一个从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

Here is a tutorial详细解释自定义属性。

但是,不能使用自定义属性强制执行编译时行为。 EntryPointAttribute是特殊的-也就是说,F#编译器知道其存在并对其进行特殊处理。 F#中还有一些其他特殊属性,例如 NoComparisonAttributeCompilationRepresentationAttribute等,但是您不能告诉编译器对您自己创建的属性进行特殊处理。

如果您描述了更大的目标(即您要实现的目标),那么我相信我们将能够找到更好的解决方案。

关于F#创建表达式的自定义属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44804767/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com