如果没有,地平线上有这样的东西吗?这是javascript / ruby / perl的一个功能,我无法生存。我知道你可以用散列成员伪造它,但我不能创造(任意)"头等"来自解析器的成员。
答案 0 :(得分:2)
目前没有什么可以设置一个尚不存在的字段。 mirror API可用于设置已存在的字段,最终可以扩展为支持动态定义新字段。
答案 1 :(得分:1)
你也可以使用" noSuchMethod"类上的方法,用于拦截setter / getter,并将接收到的值存储在映射中。
例如(我无法完全记住语法......):
class Foo {
var _dynamicProperties = new Map<String,Object>();
noSuchMethod(String function_name, List args) {
if (args.length == 0 && function_name.startsWith("get:")) {
//synthetic getter
var property = function_name.replaceFirst("get:", "");
if (_dynamicProperties.containsKey(property)) {
return _dynamicProperties[property];
}
}
else if (args.length == 1 && function_name.startsWith("set:")) {
//synthetic setter
var property = function_name.replaceFirst("set:", "");
//if the property doesn't exist, it will only be added
_dynamicProperties[property] = args[0];
return _dynamicProperties[property];
}
super.noSuchMethod(function_name, args)
}
}
然后您可以在代码中使用它,如下所示:
var foo = new Foo();
foo.bar = "Hello World";
print(foo.bar);
当然,这可能导致类型检查器无法检查的拼写错误,例如:
foo.bar = "Hello";
foo.baz = "Hello World"; // typo, meant to update foo.bar.
通过使用重定向工厂构造函数和隐含接口,有一些方法可以进行类型检查器验证,但随后它开始变得复杂。
旁注:这是JsonObject用于将json映射转换为类类型语法的内容。