BOO大全/自订属性
外观
< BOO大全
自订属性(Attribute)
[编辑]这是一个简单的自订属性(Attribute)范例,它延伸了 Boo's 的 property 属性。与自订Macro一样,命名的惯例是:"属性名称"+Attribute。
# nonempty.boo
import Boo.Lang.Compiler
import Boo.Lang.Compiler.Ast
class NonEmptyStringAttribute (PropertyAttribute):
static preCondition = ast { value is not null and len(value) > 0 }
def constructor(propName as ReferenceExpression):
super(propName,preCondition.CloneNode())
ast之后的大括号里面是我们想要用来作为属性(property)预处理条件的运算式﹔NonEmptyStringAttribute则继承自PropertyAttribute,以便使用原来PropertyAttribute的功能,然后将 preCondition 作为第二个引数,调用父类别的建构子 - CloneNode 则是表示作 AST 运算式的副本。
接着,就可以在你的专案里使用了,将上面的 nonempty.boo 编译为组件后,加入你专案的参照里,然后编译:
booc testnonempty.boo -r:nonempty.dll
译注:这是命令列模式下的使用方法,如果你使用 SharpDevelop,大可直接将 testnonempty.boo 与 nonempty.boo 放到同一个专案下,然后直接编译。 Ast attributes must be compiled to a separate assembly before they can be used.
喔,忘了附上 testnonempty.boo,这里是 testnonempty.boo:
class Person:
[NonEmptyString(Name)] # line 4
_name as string
[property(Age)]
_age as int
override def ToString():
return _name
p = Person(Name:"john",Age:36)
p.Name = '' # line 14
print p
输出结果
Unhandled Exception: System.ArgumentException: precondition '(value is not null) and (len(value) > 0)' failed: at Person.set_Name(String value) in C:\net\sciboo\examples\prop1.boo:line 4 at ~Prop1Module.Main(String[] argv) in C:\net\sciboo\examples\prop1.boo:line 14
与Getters与预处理条件里的范例比较看看,这样的标示法虽然比较不那么紧密,但是比较能表达出程式的意图。