Объявите глобальную переменную в boo - PullRequest
1 голос
/ 23 октября 2011

Насколько я могу судить по сайту , следующий код должен компилироваться в DLL со свойством верхнего уровня Version:

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 голосов
/ 24 апреля 2012

В .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)
...