Общий геттер / сеттер в дартс? - PullRequest
0 голосов
/ 18 октября 2019

Мне нужен общий способ доступа к свойству / получателю объекта.

В JavaScript это можно сделать с помощью

const obj = {
    foo: 'Hello World',
    bar: 123
};

const propName = 'foo';
console.log(o[propName]); // "Hello World"

Итак, если бы у меня был класс в Dart, например,один ниже, как бы я получить доступ к свойству в общем виде? Может быть с перегрузкой оператора или что-то?

class MyFooClass with ChangeNotifier {
  String _someText = 'Hello World';
  int _someNumber = 123;

  get someText => _someText;
  set someText(value) => _someText = value;

  get someNumber => _someNumber;
  set someNumber(value) => _someNumber = value;
}

var myFoo = MyFooClass();
print(myFoo['someText']); // The operator '[]' isn't defined for the class 'MyFooClass'

1 Ответ

0 голосов
/ 18 октября 2019

Возможно использовать dart:mirrors (обратите внимание, что я удалил несколько вещей, чтобы он сам компилировался):

import 'dart:mirrors';

class MyFooClass {
  String _someText = 'Hello World';
  int _someNumber = 123;

  get someText => _someText;
  set someText(value) => _someText = value;

  get someNumber => _someNumber;
  set someNumber(value) => _someNumber = value;

  operator [](String name) {
    InstanceMirror i = reflect(this);

    for (DeclarationMirror declMirror in i.type.declarations.values) {
      if (declMirror.isPrivate) {
        continue;
      }

      Symbol simpleName = declMirror.simpleName;

      // It's not possible to get the name from a symbol directly: https://github.com/dart-lang/sdk/issues/28372
      if (simpleName.toString() == 'Symbol("${name}")') {
        return i.getField(simpleName).reflectee;
      }
    }
  }
}

Используйте его как:

void main() {
  var myFoo = MyFooClass();
  print(myFoo['someText']); // 'Hello, World!'
  print(myFoo['someNumber']); // 123
  print(myFoo['some non existent thing']); // null
}

Старый ответ

Это то, что вы хотите?

void main() {
  var o = {'foo': 'Hello World', 'bar': 123};
  var propName = 'foo';

  print(o[propName]); // 'Hello World'
}
...