0

我的程序中有一个非常奇怪的行为,在尝试了很多事情并在这里搜索可能的答案但没有成功之后,我决定在这里提出一个新问题。所以这是我的问题:

我正在使用 describeType(),所以得到了一个 E4X XML 对象来描述我的班级。我的班级有一个没有参数的元数据 [Table]:

[Table]
class MyClass extends ORM
{
    [...]

调试正确时的 XML 对象:

trace(xmlDescription.metadata.@name[0]);
// output "Table"
trace(xmlDescription.metadata.(@name == "Table").length());
// output... 0!!!!

还检查了 XML 对象,我得到了所需节点的正确结构:

<metadata name="Table"/>

在进行研究时,我想起了 XML.ignoreWhitespace 属性。我尝试在调用 describeType() 之前将其设置为 false,但没有任何改变

所以知道如何在一个 XML 类型变量中获取这个元数据节点,我应该在逻辑上使用它(但结果是 null):

xmlDescription.metadata.(@name == "Table")[0]

???

提前致谢

PS:我使用的是 Flash Builder 4.6

4

1 回答 1

0

哇,在 Facebook 上分享了这个问题后,根本不希望从那里得到任何答案,我从一位老同事那里得到了一个工作:

显然,Flash Builder 4 中出现了一个错误,而我的问题就在它的范围内。要“修复”它,您必须使用 String 类型的局部变量才能使其工作。因此,像下面这样替换我的代码使其工作:

// before:
public function uniqueMetadata( metadataName : String ) : ReflectionMetadata
{
    var x : XML = xmlDescription.metadata.(@name == metadataName)[0];
    // x is null here

// after
public function uniqueMetadata( metadataName : String ) : ReflectionMetadata
{
    var s : String = metadataName,
        x : XML = xmlDescription.metadata.(@name == s)[0];
    // x is not null and contain the desired node!

所以,是的,奇怪的解决方法。我真的不明白怎么会发生这样的错误......

无论如何,现在它正在工作,我正在我的代码中寻找其他类似的地方,我需要在执行一些 E4X 过滤之前将参数的值复制到相同类型的局部变量中大声笑

于 2012-08-17T00:50:58.897 回答