2014-10-28 1 views
3

Посмотрите на следующий фрагмент кода.Как функция возврата, которая маркирует метаданные

import "dart:mirrors"; 

class meta { 
    final String data; 

    const meta(this.data); 
} 


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

void main() { 
    doSomething(); 
} 

Как я могу восстановить функции, то есть рынок с тегами метаданных? В моем примере я хочу узнать, какой метод отмечен метатегами.

+0

Взгляните на https://bitbucket.org/andersmholmgren/constraint/src/cb1bf16e2355a98ebc55a429f951aff198476918/lib/src/runtime_constraint_resolver.dart?at=master для кода, который делает что – Anders

ответ

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" 

Вы также можете анализировать файлы из другого проекта и использовать дротики: зеркала на этот файл вместо проверки текущей библиотеки. Возможно, libraries.values.last не всегда будет возвращать текущую библиотеку, поэтому вам может потребоваться ее изменить. В моем случае это сработало.