Дарт: Как преобразовать имена идентификаторов переменных в строки только для переменных определенного типа
Используя Дарт здесь.
Как следует из приведенного выше названия, у меня есть класс (показанный ниже), который имеет три переменные экземпляра bool. Я хочу создать функцию, которая проверяет имена идентификаторов этих переменных экземпляра и печатает каждую из них в виде строки. Получатель.declarations, который поставляется с классом ClassMirror ALMOST, делает это, за исключением того, что он также дает мне имя Конструктора и любых других методов, которые у меня есть в классе. Это не хорошо. Так что на самом деле мне нужен способ фильтрации по типу (т. Е. Только дать мне логические идентификаторы в виде строк). Любой способ сделать это?
class BooleanHolder {
bool isMarried = false;
bool isBoard2 = false;
bool isBoard3 = false;
List<bool> boolCollection;
BooleanHolder() {
}
void boolsToStrings() {
ClassMirror cm = reflectClass(BooleanHolder);
Map<Symbol, DeclarationMirror> map = cm.declarations;
for (DeclarationMirror dm in map.values) {
print(MirrorSystem.getName(dm.simpleName));
}
}
}
ВЫХОД IS: isMarried isBoard2 isBoard3 boolsToStrings BooleanHolder
1 ответ
Решение
Образец кода.
import "dart:mirrors";
void main() {
var type = reflectType(Foo);
var found = filter(type, [reflectType(bool), reflectType(int)]);
for(var element in found) {
var name = MirrorSystem.getName(element.simpleName);
print(name);
}
}
List<VariableMirror> filter(TypeMirror owner, List<TypeMirror> types) {
var result = new List<VariableMirror>();
if (owner is ClassMirror) {
for (var declaration in owner.declarations.values) {
if (declaration is VariableMirror) {
var declaredType = declaration.type;
for (var type in types) {
if (declaredType.isSubtypeOf(type)) {
result.add(declaration);
}
}
}
}
}
return result;
}
class Foo {
bool bool1 = true;
bool bool2;
int int1;
int int2;
String string1;
String string2;
}
Выход:
bool1
bool2
int1
int2