在boo中声明一个全局变量

时间:2011-10-23 05:44:50

标签: boo

据我所知website,以下代码应编译为具有顶级属性Version的DLL:

namespace MyLibrary

[Module]
class MainClass:
    public static Version as string

    static def constructor():
        Version = "0.1"

这会编译,但如果我然后将这些命令输入booish

import MyLibrary
print (Version)

然后我得到“错误:未知标识符:'版本'”。

据推测,此代码适用于该语言的早期版本。我使用的是0.9.4.9。实现这种效果的正确方法是什么?

(我注意到有一个隐式静态类MyVersionModule,其中放置了顶级静态方法,但我不知道如何向其添加属性。)

1 个答案:

答案 0 :(得分:0)

在.net中,没有办法让方法或字段实际上不是一个类的成员。 Boo通过在模块中使用主文件的隐式类来隐藏它(如您所注意到的)但是在导入时仍然需要以成员的身份访问它。

对于静力学,您必须首先引用该类型然后引用该成员,因此在您的示例中打印版本将是这样的:

import MyLibrary
print (MainClass.Version)

当然,这不是在.net中存储版本信息的“正确”方法,而是使用汇编级属性。这看起来更像是这样:

[assembly: System.Reflection.AssemblyVersion("1.0")]

namespace MyLibrary

[Module]
class MainClass:
  pass

然后获得使用反射做的版本,有几种方法可以获得程序集,但最简单的方法是获取Type然后它的程序集:

import System
import System.Reflection
import MyLibrary

atts = typeof(MainClass).Assembly \
         .GetCustomAttributes(typeof(AssemblyVersionAttribute), false)

version = (atts[0] as AssemblyVersionAttribute).Version
print(version)