Flash 在自定义名称空间中动态访问属性
鉴于此:Flash 在自定义名称空间中动态访问属性,flash,actionscript-3,Flash,Actionscript 3,鉴于此: public namespace foo; foo var bar:String = "baz"; 我们可以访问属性“bar”,如下所示: 但是,这不起作用: var ns:Namespace = new Namespace("foo"); trace(ns::["bar"]); 它给了我以下错误: ReferenceError:Error#1069:在MyClass上找不到属性foo::bar,并且没有默认值 在进一步检查foo名称空间时,我可以看到(在调试器中)URI的格式为{
public namespace foo;
foo var bar:String = "baz";
我们可以访问属性“bar”,如下所示:
但是,这不起作用:
var ns:Namespace = new Namespace("foo");
trace(ns::["bar"]);
它给了我以下错误:
ReferenceError:Error#1069:在MyClass上找不到属性foo::bar,并且没有默认值
在进一步检查foo名称空间时,我可以看到(在调试器中)URI的格式为{package}:{type}/{name}。如果我尝试通过执行以下操作来复制这一点:
var ns:Namespace = new Namespace(getQualifiedClassName(this).replace("::", ":") + "/foo");
trace(ns::["bar"]);
(drumroll)
还是没有骰子
此外,我还尝试了以下组合,但运气不佳:
var ns:Namespace = new Namespace(null, getQualifiedClassName(this).replace("::", ":") + "/foo");
var ns:Namespace = new Namespace("", getQualifiedClassName(this).replace("::", ":") + "/foo");
有人知道是否有可能像这样访问命名空间成员吗?我没有对命名空间的编译时访问权限,但我可以在运行时动态查找它的uri(和前缀)。编辑2:
好的,这里的问题是,当您创建一个名称空间时,编译器使用标志包internal创建它,或者在as3中您无法使用不同的访问标志(public、protected,…)创建一个名称空间
因此,如果您的命名空间被声明为public,则可以使用函数获取它
这里是一个解析uri并返回命名空间的函数示例,无论命名空间在文件或类中声明在哪里
package XXX {
public namespace foo;
}
或
下面是一个函数示例,该函数从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");
编辑:
好的,我读错了,您有一个问题是动态名称空间名称不是动态属性名称:
因此,您可以通过从定义名称空间的类对名称空间名称进行静态调用来访问创建的名称空间:
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示例:
您可以使用自定义命名空间和动态名称创建一个新的名称空间,然后使用此[myQName]访问属性:
var ns:Namespace=foo;
var qn:QName=new QName(foo, 'bar');
trace(this[qn]);
下面是wonderfl上的实时示例:试图为您找到答案,但运气不佳。甚至尝试使用
使用名称空间ns代码>但也有同样的问题。希望你能找到答案+谢谢你的努力,谢谢你!我昨晚大部分时间都没睡,想弄明白这件事。在正式放弃之前,我还有一件事要检查,那就是看看反汇编程序对字节码的解释。我在Adobe的文档中找不到任何有价值的东西。再次感谢您的努力!不幸的是,我想我可能不清楚。问题是,我无法访问名称空间。我唯一拥有的是它的uri和一个随机对象,该对象在这个名称空间中定义了一个属性。问题是,当我尝试访问该属性时,如果给定一个动态创建的名称空间实例,Flash会失败并出现错误。我希望这能把事情弄清楚一点,如果没有,请告诉我!很酷找到帕特里克,非常感谢你的帮助!抱歉,接受时间太长,事情耽搁了。
public namespace foo;
foo var bar:String = "baz";
var ns:Namespace=MyClass['foo'];
trace(ns::['bar'])
var ns:Namespace=foo;
var qn:QName=new QName(foo, 'bar');
trace(this[qn]);