且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-06-27 05:52:59

要创建自定义属性,只需声明一个继承自System.Attribute的类:

To create a custom attribute, simply declare a class that inherits from System.Attribute:

type MyAttribute() = inherit System.Attribute()

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

如您所见,将属性应用于代码单元时,可以省略后缀"Attribute". (可选)您可以为属性提供参数或属性:

As you can see, the suffix "Attribute" can be omitted when applying the attribute to code units. Optionally, you can give your attribute parameters or properties:

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

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

在运行时,您可以检查类型,方法和其他代码单元,以查看将哪些属性应用于它们,并检索其数据:

At runtime, you can inspect types, methods, and other code units to see which attributes are applied to them, and to retrieve their data:

[<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 explaining custom attributes in more detail.

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

However, you cannot use custom attributes to enforce compile-time behavior. The EntryPointAttribute is special - that is, the F# compiler knows about its existence and gives it special treatment. There are some other special attributes in F# - for example, NoComparisonAttribute, CompilationRepresentationAttribute, etc., - but you cannot tell the compiler to give special treatment to attributes that you yourself created.

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

If you describe your larger goal (i.e. what you're trying to achieve), I'm sure we'll be able to find a better solution.