【问题标题】:Compare Dart @override Metadata Reflectee to Instance of _Override比较 Dart @override Metadata Reflectee 和 _Override 的实例
【发布时间】:2020-11-10 14:37:51
【问题描述】:

我正在尝试提出一个示例,说明如何使用 Dart 中的反射搜索 @override 元数据注释。

在我用来学习 dart:mirrors 库和反射的示例中,他们总是在搜索自定义注释。

Here is an example where they search for a custom "Todo" annotation

在搜索自定义注释时,他们只需将元数据的反射对象与类数据类型进行比较以检查是否匹配。

在下面链接的 Dart 文档中,您可以看到 _Override 实例的示例实现。

Here is Dart documentation on the override constant

这导致我尝试:

if(meta.reflectee is _Override) {
    print('Found!);
}

但“_Override”无法解析,并建议没有导入来访问此类数据实例。

我可以 toString 反射器进行比较,但我觉得这是一个肮脏的解决方案:

if (meta.reflectee.toString() == "Instance of '_Override'") {
    print('Found!');
}

在使用@override 注释时,我正在努力寻找一种方法将元数据的反射对象与_Override 的实例类型进行比较。

这里是 Dog 类:

class Dog extends Animal {
  Dog(String name) : super(name);

  @override
  void makeNoise() {
    print('Bark, bark!');
  }
}

这是我的反射搜索代码:

 Dog dog = Dog('Harper');

  InstanceMirror instanceMirror = reflect(dog);
  ClassMirror classMirror = instanceMirror.type;

  classMirror.instanceMembers.forEach((_, member) {

    print(member.owner.simpleName);
    print(member.simpleName);
    print(member.isRegularMethod);

    member.metadata.forEach((meta) {
      print(meta.reflectee);
      if (meta.reflectee is _Override) {
        print('Found!');
      }
      
    });
  });

最后,当 instanceMembers.forEach 循环到达我感兴趣的方法时,这是我的输出:

Symbol("Dog")
Symbol("makeNoise")
true
Instance of '_Override'

【问题讨论】:

    标签: dart reflection annotations overriding metadata


    【解决方案1】:

    用途:

    if (meta.reflectee == override) {
      print('Found!);
    }
    

    if (identical(meta.reflectee, override)) {
      print('Found!);
    }
    

    Dart 常量是规范化的,override 对象(私有 _Override 类的一个实例)不会从 Object 覆盖 operator==,所以这两个表达式做同样的事情。

    对于有数据的注解类,你不知道确切的实例,所以你必须做类型检查。对于像override 这样只有一个实例的标记注释,您可以与用于注释的确切常量实例进行比较。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-01
      • 2021-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多