Как я могу получить параметры конструктора через отражение в Dart?

Я играю с зеркалами в Dart. Я не могу найти способ отразить класс и выяснить, есть ли у него конструктор и, если да, то каковы параметры этого конструктора.

С ClassMirror похоже, что коллекция «объявлений» объектов DeclarationMirror будет включать запись для конструктора, но с DeclarationMirror нет способа определить, является ли он конструктором, и нет возможности увидеть информацию о параметрах.

С коллекцией объектов MethodMirror "instanceMembers" похоже, что конструкторы даже не включены. Я предполагаю, что это связано с тем, что конструктор не является обычным методом, который можно было бы вызвать, но все же это странно, поскольку MethodMirror имеет атрибут «isConstructor».

Есть ли способ, учитывая тип объекта, выяснить, есть ли у него конструктор, и если да, то получить информацию о параметрах этого конструктора?

Код ниже иллюстрирует проблему:

import 'dart:mirrors';

class Person {
  String name;
  int age;

  Person(this.name, this.age);

  string getNameAndAge() {
    return "${this.name} is ${this.age} years old";
  }

}

void main() {
  ClassMirror classMirror = reflectClass(Person);

  // This will show me the constructor, but a DeclarationMirror doesn't tell me
  // anything about the parameters.
  print("+ Declarations");
  classMirror.declarations.forEach((symbol, declarationMirror) {
    print(MirrorSystem.getName(symbol));
  });

  // This doesn't show me the constructor
  print("+ Members");
  classMirror.instanceMembers.forEach((symbol, methodMirror) {
    print(MirrorSystem.getName(symbol));
  });
}

person Sean    schedule 19.05.2014    source источник


Ответы (1)


Во-первых, вам нужно найти конструкторов на declarations карте.

ClassMirror mirror = reflectClass(Person);

List<DeclarationMirror> constructors = new List.from(
  mirror.declarations.values.where((declare) {
    return declare is MethodMirror && declare.isConstructor;
  })
);

Затем вы можете преобразовать DeclarationMirror в MethodMirror и использовать геттер MethodMirror.parameters для получения всех параметров конструктора. Что-то типа:

constructors.forEach((construtor) {
  if (constructor is MethodMirror) {
    List<ParameterMirror> parameters = constructor.parameters;
  }
});
person long.luc    schedule 19.05.2014