Как мне получить все поля для класса в Dart?

Я просмотрел библиотеку dart: mirrors и нашел ClassMirror . Пока я видел getField, я не видел доступа ко всем полям. Но я видел getters.

Если я хочу получить все поля для класса, нужно ли мне пройти getters?


person Seth Ladd    schedule 10.06.2013    source источник


Ответы (2)


Ответ Здеслава Войковича немного устарел.

У меня это работает для Dart 1.1.3 по состоянию на 2 марта 2014 года.

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   
person corgrath    schedule 02.03.2014
comment
По крайней мере, на сегодняшний день dart: mirrors больше не поддерживается для веб-приложений. У меня такое ощущение, что это не рекомендуется для всех типов приложений. - person T. Cervenka; 08.02.2019

Нет, вам следует пройти 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 вернет только b и c.

person Zdeslav Vojkovic    schedule 10.06.2013
comment
Ага, спасибо! Слово variables действительно вводит в заблуждение, я бы хотел, чтобы оно называлось fields. - person Seth Ladd; 10.06.2013
comment
Согласен: я дважды просмотрел документы API и оба раза пропустил variables :) затем я заметил VariableMirror подкласс DeclarationMirror. Однако есть также LibraryMirror, где переменные имеют больше смысла, ИМО - я думаю, это сделано для согласованности (или "согласованности", не могу решить :) - person Zdeslav Vojkovic; 10.06.2013
comment
Это действительно так? ClassMirror.variables не существует в соответствии с документами - person corgrath; 02.03.2014
comment
ну, это было в июне 2013 года. Думаю, его заменили на свойство declarations: api.dartlang.org/apidocs/channels/stable/ - person Zdeslav Vojkovic; 02.03.2014
comment
Я предоставил модифицированную рабочую версию, но я не уверен, лучшее ли это решение или есть лучшие решения. - person corgrath; 02.03.2014