【问题标题】:How do I get all fields for a class in Dart?如何在 Dart 中获取一个类的所有字段?
【发布时间】:2013-06-05 22:59:36
【问题描述】:

我查看了 dart:mirrors 库,发现 ClassMirror。当我看到getField 时,我没有看到对所有 字段的访问权限。不过,我确实看到了getters

如果我想获取一个类的所有字段,我必须通过getters 吗?

【问题讨论】:

    标签: dart dart-mirrors


    【解决方案1】:

    Zdeslav Vojkovic 的回答有点老了。

    截至 2014 年 3 月 2 日,这适用于我的 Dart 1.1.3。

    import 'dart:mirrors';
    
    class Test {
        int a = 5;
    
        static int s = 5;
    
        final int _b = 6;
    
        int get b => _b;
    
        int get c => 0;
    }
    
    void main() {
    
        Test t = new Test();
        InstanceMirror instance_mirror = reflect(t);
        var class_mirror = instance_mirror.type;
    
        for (var v in class_mirror.declarations.values) {
    
            var name = MirrorSystem.getName(v.simpleName);
    
            if (v is VariableMirror) {
                print("Variable: $name => S: ${v.isStatic}, P: ${v.isPrivate}, F: ${v.isFinal}, C: ${v.isConst}");
            } else if (v is MethodMirror) {
                print("Method: $name => S: ${v.isStatic}, P: ${v.isPrivate}, A: ${v.isAbstract}");
            }
    
        }
    }
    

    会输出:

    Variable: a => S: false, P: false, F: false, C: false
    Variable: s => S: true, P: false, F: false, C: false
    Variable: _b => S: false, P: true, F: true, C: false
    Method: b => S: false, P: false, A: false
    Method: c => S: false, P: false, A: false
    Method: Test => S: false, P: false, A: false   
    

    【讨论】:

    • 至少从今天开始,网络应用不再支持 dart:mirrors。我觉得它不适合所有类型的应用程序。
    【解决方案2】:

    不,你应该通过ClassMirror.variables

    class Test {
      int a = 5;
      static int s = 5;
      final int _b = 6;
    
      int get b => _b;
      int get c => 0;
    }
    
    void main() {
      Test t = new Test();
      InstanceMirror instance_mirror = reflect(t);
      var class_mirror = instance_mirror.type;
      for(var v in class_mirror.variables.values)
      {
        var name = MirrorSystem.getName(v.simpleName);
        print("$name => S: ${v.isStatic}, P: ${v.isPrivate}, F: ${v.isFinal}");
      }
    }
    

    这将输出:

    _b => S: false, P: true, F: true 
    a => S: false, P: false, F: false
    s => S: true, P: false, F: false
    

    ClassMirror.getters 只会返回 bc

    【讨论】:

    • 啊哈,谢谢! variables 这个词真的很误导人,我希望它被称为fields
    • 同意:我浏览了 API 文档两次,两次都错过了 variables :) 然后我注意到 VariableMirror 的子类 DeclarationMirror。但是,还有LibraryMirror,变量更有意义,IMO - 我想这是为了一致性(或“一致性”,无法决定:)
    • 这有效吗?根据文档,ClassMirror.variables 不存在
    • 嗯,那是在 2013 年 6 月。我猜它被替换为 declarations 属性:api.dartlang.org/apidocs/channels/stable/…
    • 我提供了一个修改后的工作版本,但我不确定这是最好的解决方案还是有更好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 2011-03-29
    • 1970-01-01
    • 2022-06-16
    相关资源
    最近更新 更多