【问题标题】:How retrieve function that marks with metadata如何检索用元数据标记的函数
【发布时间】:2014-10-28 08:43:28
【问题描述】:

看下面的代码sn-p。

import "dart:mirrors";

class meta {
    final String data;

    const meta(this.data);
}


@meta("Tag")
doSomething() => print("You have to do something");

void main() {
    doSomething();
}

如何检索功能,即带有元数据标签的市场?在我的示例中,我想找出哪个方法被标记了元标记。

【问题讨论】:

标签: dart dart-mirrors


【解决方案1】:

你可以这样做:

void main() {
    doSomething();
    getMetaData();
}

void getMetaData() {
  LibraryMirror currentLib = currentMirrorSystem().libraries.values.last;
  currentLib.declarations.forEach((Symbol s, DeclarationMirror mirror) {
    if(mirror.metadata.length > 0) {
      print('Symbol $s has MetaData: "${mirror.metadata.first.reflectee.data}"');
    }
  });
}

这应该给你:

You have to do something
Symbol Symbol("doSomething") has MetaData: "Tag"

您还可以分析来自另一个项目的文件并在该文件上使用 dart:mirrors,而不是检查当前库。也许libraries.values.last 不会总是返回当前库——所以你可能需要改变它。就我而言,它有效。

【讨论】:

    【解决方案2】:
    var decls = currentMirrorSystem().isolate.rootLibrary.declarations;
    print(decls.keys.where((k) => decls[k] is MethodMirror && 
        decls[k].metadata.where((k) => k.reflectee is meta).isNotEmpty));
    

    另见How can i test the existence of a function in Dart?

    【讨论】:

      猜你喜欢
      • 2016-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多