【问题标题】:how to get a string for a class property name in dart?如何在飞镖中获取类属性名称的字符串?
【发布时间】:2020-07-16 01:07:14
【问题描述】:

我想使用模型的属性,例如: Animal.id 作为函数的参数或使用一些扩展方法能够“id”。同样,我想以这种方式使用 Animal.title 来获取“title”作为返回值。我怎么能用我的类来获取任何给定属性名称的字符串?

  int _id;
  String _title;

  Animal(this._id, this._title);

  int get id => _id;
  String get title => _title;
}

用例能够在不自动完成我的模型的属性名称的情况下进行查询,以便进行 sql 查询:

List<Map> results = await db.query("Animal",
        columns: Set. ["id", "title"],
        where:  'id = ?',
        whereArgs: [id]);

【问题讨论】:

    标签: class dart


    【解决方案1】:

    使用dart:mirrors 包,您可以动态访问您的类属性并使用它们的字符串名称调用方法。

    https://api.dart.dev/stable/2.4.0/dart-mirrors/dart-mirrors-library.html

    
    import 'dart:mirrors';
    
    class Animal {
      int _id;
      String _title;
    
      Animal(this._id, this._title);
    
      int get id => _id;
      String get title => _title;
    }
    
    main() {
      var r = reflect(Animal(1, 'Dog'));
    
      print(r.getField(Symbol('id')).reflectee);
      print(r.getField(Symbol('title')).reflectee);
    }
    
    

    【讨论】:

    • 请注意,镜像库依赖于平台,可能无法在您的目标平台上运行。
    • 这看起来像是通过字符串访问属性的反射,对吧?我正在寻找使用自动完成并获取属性的字符串表示形式——而不是相反。
    【解决方案2】:
    import 'dart:mirrors';
    
    class MyClass {
      int i, j;
      void my_method() {  }
    
      int sum() => i + j;
    
      MyClass(this.i, this.j);
    
      static noise() => 42;
    
      static var s;
    }
    
    main() {
      MyClass myClass = new MyClass(3, 4);
      InstanceMirror myClassInstanceMirror = reflect(myClass);
    
      ClassMirror MyClassMirror = myClassInstanceMirror.type;
    
      InstanceMirror res = myClassInstanceMirror.invoke(#sum, []);
      print('sum = ${res.reflectee}');
    
      var f = MyClassMirror.invoke(#noise, []);
      print('noise = $f');
    
      print('\nMethods:');  
      Iterable<DeclarationMirror> decls =
          MyClassMirror.declarations.values.where(
            (dm) => dm is MethodMirror && dm.isRegularMethod);
      decls.forEach((MethodMirror mm) {
        print(MirrorSystem.getName(mm.simpleName));
      });
    
      print('\nAll declarations:');
      for (var k in MyClassMirror.declarations.keys) {
        print(MirrorSystem.getName(k));
      }
    
      MyClassMirror.setField(#s, 91);
      print(MyClass.s);
    }
    

    输出:

    sum = 7
    noise = InstanceMirror on 42
    
    Methods:
    my_method
    
    sum
    
    noise
    
    All declarations:
    i
    j
    s
    my_method
    
    sum
    noise
    MyClass
    91
    

    【讨论】:

      猜你喜欢
      • 2021-04-04
      • 2011-04-12
      • 2014-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-06
      相关资源
      最近更新 更多