有没有办法将符号转换为字符串?
例如,VariableMirror 返回符号而不是字符串。有没有办法将符号转换为字符串,所以我可以打印一个类的所有变量名?
import 'dart:mirrors';
void main() {
var sym = new Symbol('test');
print(MirrorSystem.getName(sym));
}
这输出:
测试
我对这个问题也很感兴趣。
我不能在我的包中使用 'dart:mirrors',所以使用以下内容:
String s = new Symbol('hi').toString();
s = s.substring(8,pn.length-2);
看起来很糟糕,但它可以完成工作。也许有一个性能问题。
没想到这个,谢谢。
即使它现在有效,将来也有可能损坏,所以我想最好避免使用'toString()'。
确认的:
Warning: 'hi=' is used reflectively but not in MirrorsUsed. This will break minified code.index.bootstrap.initialize.dart.js:7612
Warning: 'hi' is used reflectively but not in MirrorsUsed. This will break minified code`
事实证明有一个简单的解决方案
print(MirrorSystem.getName(symbol));
印刷
某人的名字
另见:https ://code.google.com/p/dart/issues/detail?id=17471
编辑
@lrn 对上面链接的问题的有趣评论
它是故意“难以使用”的。符号可以通过 dart2js 缩小,查找它们的原始名称只能通过镜像系统完成。这允许 dart2js 知道该功能是否被使用,如果不需要,则不包含转换表。一般来说,如果可能的话,我建议以一种不需要将符号转换为字符串的方式进行编码。将它们视为不透明的标记,并且仅将它们与其他标记进行比较。
Smoke 包为此提供了一项服务,该服务由其转换器以一种也适用于缩小 JavaScript 的方式转换为代码。symbolToName()
和nameToSymbol()
。
一些示例代码:
// Listen for App changes so we can do some things.
app.changes.listen((List<ChangeRecord> records) {
PropertyChangeRecord record = records[0] as PropertyChangeRecord;
String changedValue = MirrorSystem.getName(record.name);
if (changedValue == "pageTitle") {
print("$changedValue changed!");
}
}