dart - Dart中的通用getter/setter?

标签 dart getter-setter generic-programming

我需要一种通用的方法来访问对象的属性/ getter 。

在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'

最佳答案

可以使用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'
}

关于dart - Dart中的通用getter/setter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58452921/

相关文章:

java - Java 是否具有与 Objective-C 中的 @synthesize 等效的功能?

java - 如何使用泛型函数参数

rust - 是否有任何特征可以指定数字功能?

flutter - 命名参数不能以 null safe flutter 下划线开头

c# - “短工具”Getter 'Long-Implement' Setter

printing - Dart语言:打印报告

java - 类中的 getter 和 setter?

c++ - 在 STL 容器中使用模板类

user-interface - 如何在脚手架上对齐背景图像?

flutter - 将对象数组拆分为多个列表