【问题标题】:Generic getter/setter in Dart?Dart 中的通用 getter/setter?
【发布时间】:2019-10-18 14:30:30
【问题描述】:

我需要一种通用的方法来访问对象的属性/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'

【问题讨论】:

  • 你不能。您需要创建一个基类,指定 someText getter 作为其接口的一部分。

标签: dart getter-setter generic-programming


【解决方案1】:

可以使用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:mirrors吗?
  • 嗯,这个dart:mirrors 的答案看起来很整洁,但据我所知,镜像包目前不能在稳定分支中使用,可以吗?
  • 可以,但是文档说“dart:mirrors 库不稳定,它的 API 可能会因用户反馈而略有变化”:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-25
  • 1970-01-01
  • 2014-03-19
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多