【问题标题】:Populating a parent field dynamically in Dart在 Dart 中动态填充父字段
【发布时间】:2014-01-05 13:48:58
【问题描述】:

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

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

  NoSuchMethodError : method not found: 'name'

代码:

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);
}

【问题讨论】:

    标签: dart dart-mirrors


    【解决方案1】:

    您应该使用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);
    }
    

    【讨论】:

    • 有没有办法在不遍历层次结构的情况下获取所有继承的字段?
    • 我认为你必须遍历层次结构。
    【解决方案2】:

    Dart 中不继承静态方法/字段。
    这里已经有一些关于这种行为的讨论。
    你可以看看这个问题的答案in Dart, using Mirrors, how would you call a class's static method from an instance of the class?

    如果您尝试访问的方法/字段不是静态的,请提供更多代码(您反映的类/对象)

    【讨论】:

      猜你喜欢
      • 2021-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-04
      相关资源
      最近更新 更多