2014-10-28 3 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이 현재 라이브러리를 반환하지 않을 수도 있으므로 변경해야 할 수도 있습니다. 내 경우에는 효과가있었습니다.