我想创建一个等于私有MethodMirror的简单名称的符号。但是,Symbol的文档声明新Symbol的参数必须是有效的公共标识符。如果我尝试创建一个const Symbol('_privateIdentifier')
dart编辑器通知我对此常量表达式的评估将引发异常 - 虽然程序运行正常,但我能够毫无问题地使用它。
void main(){
//error flagged in dart editor, though runs fine.
const s = const Symbol('_s');
print(s); //Symbol("_s");
}
镜像系统似乎使用了符号。
import 'dart:mirrors';
class ClassA{
_privateMethod(){}
}
void main(){
var classMirror = reflect(new ClassA()).type;
classMirror.declarations.keys.forEach(print);
//Symbol("_privateMethod"), Symbol("ClassA")
}
飞镖编辑器中的文档/错误标记是否是由于过时的飞镖分析器导致的遗留错误?或者是否有计划在未来执行这项公共要求?是否有另一种方法可以创建一个唯一的识别符号,该符号将缩小为与声明的简单名称相同的符号
答案 0 :(得分:3)
如果它没有抛出,那么VM在const符号构造函数中有一个错误。
问题在于" _s"如果没有说出它属于哪个库,则不会识别私有变量。由于这个原因,符号构造函数有一个第二个参数采用LibraryMirror
,并且传入一个私有名称而不传入镜像应抛出。
在const构造函数中很难做到这一点而没有侧面执行const构造函数的要求(没有执行代码!),这可能是VM无法处理它的原因。它需要在编译器级别进行特殊处理。
您还会发现const Symbol('_s')
与#_s
不同。后者为当前库创建一个私有符号,前者(如果它运行)创建一个名为' _s'的非私有符号,这不是真正有用的。例如,print(identical(#_s, const Symbol('_s')));
打印为false。
答案 1 :(得分:1)
要抓住符号,我认为你需要从对象中获取它。 e.g。
reflect(thing).type.declarations.keys.firstWhere(
(x) => MirrorSystem.getName(x) == "_privateThingIWant");