Как преобразовать имена переменных в строку в Dart?

Очень плохо знаком с Flutter и Dart, так что извините за некорректный вопрос.

Это общий код, который у меня есть:

// Constructor class
class ctr {
  String i;
  ctr(String a){
    this.a = a; 
}

// New variables based on contsructor
var ctrA = ctr('a');
var ctrB = ctr('b');
var ctrC = ctr('c');

// Storing the variables based on constructor in an array
List ctrList = [ctrA, ctrB, ctrC]

void main() {
  String match = 'ctrB';
  for (var i = 0; i<ctrList.length; i++) {
    if(match == ctrList.toString() {
      print('The string of your match is ${ctrList[i].a}');
    } else {
      print('Error!);
    }
  }
}

Текущий выход Error!. Вместо этого я ищу a.

Как видите, я пытаюсь выполнить итерацию переменной match по массиву, в котором хранятся переменные, на основе вышеупомянутого конструктора, и, если он совпадает, распечатать значение в конструкторе, которому он сопоставлен. runtimeType может получить мне только имя исходного класса (которым будет ctr).

Я попытался преобразовать имя переменной с помощью toString(), но это тоже не сработало. Что мне нужно, так это способ преобразовать эти имена переменных в строку и получить совпадение, но я не уверен, что я могу сделать.

Заранее спасибо за помощь!


person ndisisnd    schedule 28.05.2020    source источник
comment
Следуйте соглашению CamelCase при объявлении имени класса.   -  person Hritik Gupta    schedule 29.05.2020


Ответы (2)


В Dart нет возможности получить имя объекта. Например, в C # есть функция nameof(), но в Dart нет ничего подобного.

При этом, вероятно, есть гораздо более простой способ сделать это, независимо от причины, по которой вам это нужно. Так что не стесняйтесь спрашивать об альтернативных подходах.

Если вы просто хотите использовать имя переменной как своего рода идентификатор, возможно, загляните в Карты.

Map<String,String> x = {"ctrB" : "b"};

Они позволяют вам определять ключ и значение любого типа, который вы хотите.

РЕДАКТИРОВАТЬ: в стороне, это объявление

class ctr {
  String i;
  ctr(String a){
    this.a = a; 
}

можно упростить до этого:

class ctr {
  String i;
  ctr(this.i);

}
person Benedikt J Schlegel    schedule 28.05.2020
comment
Когда тип элемента - Map ‹String, String›, какой тип элемента тогда, когда он хранится в массиве? Я полагаю, мой Список ‹ctr› больше не может работать. - person ndisisnd; 29.05.2020
comment
Это будет List ‹Map‹ String, String ››, т.е. список карт строк: D. Конечно, вы можете сохранить свой объект, если хотите, используя вместо него Map ‹String, ctr› или любую другую комбинацию типов. - person Benedikt J Schlegel; 29.05.2020

Вот как вы должны объявить список настраиваемых объектов.

List<ctr> ctrList= [ ctrA , ctrB , ctrC ];

void main() {
String match = 'ctrB';
for (var index = 0; i<ctrList.length; i++) {
if(match == ctrList[index].i {
  print('The string of your match is ${ctrList[i].a}');
} else {
  print('Error!);
}}
person Hritik Gupta    schedule 28.05.2020