Редактировать 2:
Хорошо, проблема в том, что когда вы создаете пространство имен, компилятор создает его с внутренним пакетом флага, или у вас нет способа создать в as3 пространство имен с другим флагом доступа (public, protected, ...)
Таким образом, если ваше пространство имен объявлено общедоступным, вы можете получить его с помощью функции getDefinition .
Вот пример функции, которая анализирует ваш URI и возвращает вам ваше пространство имен, где бы оно ни было объявлено в файле или в классе
package XXX {
public namespace foo;
}
или
package YYY {
class XXX {
public namespace foo2;
}
}
Вот пример функции, которая дает вам пространство имен из uri
public function getNamespaceFromURI(uri:String, domain:ApplicationDomain = null):Namespace {
if(domain == null) domain = ApplicationDomain.currentDomain;
var tmp:Array = uri.split("/");
var ns:Namespace = null;
var pkg:String = tmp[0].replace(":", ".");
if(tmp.length == 1) {
// namespace declared in a file
ns = domain.getDefinition(pkg) as Namespace;
} else {
// namespace inside a class
var cls:Class = domain.getDefinition(pkg) as Class;
if(cls) {
ns = cls[tmp[1]] as Namespace;
}
}
return ns;
}
Использование:
var ns:namespace = getNamespaceFromURI("YYY:foo");
// or
var ns:namespace = getNamespaceFromURI("YYY:XXX/foo2");
Edit:
Хорошо, я не прочитал, что у вас есть проблема с динамическим именем пространства имен, а не с динамическим именем свойства:
Таким образом, вы можете получить доступ к созданному вами пространству имен путем статического обращения к имени вашего пространства имен из класса, в котором оно определено:
class X {
public namespace foo;
}
var ns:Namespace=X['foo'];
Итак, для вашего примера это:
public namespace foo;
foo var bar:String = "baz";
var ns:Namespace=MyClass['foo'];
trace(ns::['bar'])
Я обновил пример Wonderfl: http://wonderfl.net/c/7M9O
Вы можете создать новое QName с вашим пользовательским пространством имен и динамическим именем, а затем получить доступ к свойству с помощью этого [myQName]:
var ns:Namespace=foo;
var qn:QName=new QName(foo, 'bar');
trace(this[qn]);
Вот живой пример на wonderfl: http://wonderfl.net/c/7M9O