如何检索用元数据标记的函数

时间:2014-10-28 08:43:28

标签: dart dart-mirrors

请查看以下代码段。

import "dart:mirrors";

class meta {
    final String data;

    const meta(this.data);
}


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

void main() {
    doSomething();
}

如何检索具有元数据标签的市场功能?在我的例子中,我想找出哪个方法用meta标记。

2 个答案:

答案 0 :(得分:3)

你可以这样做:

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不会总是返回当前库 - 因此您可能需要更改它。就我而言,它有效。

答案 1 :(得分: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?