如何在Dart中实现动态属性?

jz8*_*z87 8 dart

我希望能够使用noSuchMethod()中的查找使用Map来支持动态属性.但是,最新更改会使传入的属性引用名称不可用.我可以理解缩小场景要求我们使用符号而不是字符串作为名称,但这使得实现可序列化的动态属性变得困难.任何人都有关于如何处理这个问题的好主意?

  • 我不能使用String名称,因为在对minifier的调用之间没有修复String名称.(这会彻底打破序列化)

Ale*_*uin 10

您可以使用以下方式访问原始名称 MirrorSystem.getName(symbol)

所以动态类看起来像:

import 'dart:mirrors';

class A {
  final _properties = new Map<String, Object>();

  noSuchMethod(Invocation invocation) {
    if (invocation.isAccessor) {
      final realName = MirrorSystem.getName(invocation.memberName);
      if (invocation.isSetter) {
        // for setter realname looks like "prop=" so we remove the "="
        final name = realName.substring(0, realName.length - 1);
        _properties[name] = invocation.positionalArguments.first;
        return;
      } else {
        return _properties[realName];
      }
    }
    return super.noSuchMethod(invocation);
  }
}

main() {
  final a = new A();
  a.i = 151;
  print(a.i); // print 151
  a.someMethod(); // throws
}
Run Code Online (Sandbox Code Playgroud)