BOO大全/自订属性

上一章:延伸方法 目录 下一章:自订Macro


自订属性(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与预处理条件里的范例比较看看,这样的标示法虽然比较不那么紧密,但是比较能表达出程式的意图。


上一章:延伸方法 目录 下一章:自订Macro