在Dart中动态填充父字段

Tod*_*ery 5 dart dart-mirrors

我正在从Map数据动态创建对象,填充字段以匹配键名.在父项上定义字段时会出现问题,尝试在父字段上设置值会产生错误:

No static setter 'name' declared in class 'Skill'.

  NoSuchMethodError : method not found: 'name'
Run Code Online (Sandbox Code Playgroud)

码:

class Resource {
  String name;
  String description;

  Resource.map(Map data)
  {
    ClassMirror c = reflectClass(runtimeType);
    ClassMirror thisType = c;
    while(c != null)
    {
      for (var k in c.declarations.keys) {
        print('${MirrorSystem.getName(k)} : ${data[MirrorSystem.getName(k)]}');
        if(data[MirrorSystem.getName(k)] != null)
        {
          thisType.setField(k, data[MirrorSystem.getName(k)]);        
        }
      }
      c = c.superclass;
    }
  }
}

class Skill extends Resource
{
  Skill.map(data) : super.map(data);
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*uin 5

您应该使用a ObjectMirror在对象上设置字段.您的代码尝试设置一个ClassMirror尝试定义静态变量的字段.

class Resource {
  String name;
  String description;

  Resource.map(Map data)
  {
    ObjectMirror o = reflect(this);  // added
    ClassMirror c = reflectClass(runtimeType);
    ClassMirror thisType = c;
    while(c != null)
    {
      for (var k in c.declarations.keys) {
        print('${MirrorSystem.getName(k)} : ${data[MirrorSystem.getName(k)]}');
        if(data[MirrorSystem.getName(k)] != null)
        {
          // replace "thisType" with "o"
          o.setField(k, data[MirrorSystem.getName(k)]);
        }
      }
      c = c.superclass;
    }
  }
}

class Skill extends Resource
{
  Skill.map(data) : super.map(data);
}
Run Code Online (Sandbox Code Playgroud)