2013-01-17 1 views
3

나는 ListString이라고 가정합니다.Dart의 거울을 사용하여 구체적인 유형의 일반 유형 변수를 얻으려면 어떻게해야합니까?

var myList = new List<String>(); 
내가 myListList 거울을 사용하여 String의의 것을 알아낼 수있는 방법

?


나는 ClassMirrortypeVariables를 사용하여 시도했지만 거울 그냥 gerneric List 클래스를 설명하는 것 같다.
InstanceMirror im = reflect(myList); // InstanceMirror on instance of 'List' 
ClassMirror cm = im.type; // ClassMirror on 'List' 
print(cm.typeVariables['E']) // TypeVariableMirror on 'E' 

는 또한 문서에서 이걸 발견하지만 난 originalDeclaration에 접근하는 것은 NoSuchMethodError를 포기하지 않는 ClassMirror 인스턴스를 찾을 못하고있다.

최종 ClassMirror의 originalDeclaration

이 유형의 원래 선언에 거울.

대부분의 클래스에서이 클래스는 고유 한 선언입니다. 그러나 generic 클래스의 경우 언 바운드 형식 변수가있는 원래 클래스 선언과 바운드 형식 변수가있는 generic 클래스 인스턴스 사이에는 구별이 있습니다.

+0

FWIW을 추적 할 위치 : http://code.google.com/p/dart/issues/detail?id=7957 무언가가 변경되면 알림을 받기 위해 별표를 표시 할 수 있습니다. –

+1

예제는 더 정확해야하며 예제로 사용하십시오. Dart에서는 유형이 선택 사항이므로 실제 객체 인스턴스화를 표시하려면'var myList = new List ()'을 사용해야합니다. –

+0

@SethLadd 답변 해 주셔서 감사합니다. 나는 그에 맞게 나의 예를 바꿨다. 그래서 나는 그 버그가 고쳐지기 전까지는 "불가능할 것"이라고 생각합니다. 그때 이것이 여기에 (받아 들여진) 대답이되어서는 안됩니까? –

답변

6

2 가능한 방법. 이 반사 이상 확대됨 인 것에

첫 번째 방법은, is 연산자를 사용하여 변수의 종류를 확인하는 것이다

var myList = new List<String>(); 
print(myList is List<int>); // false 
print(myList is List<String>); // true 

번째 방법은 ClassMirror.typeArguments 사용한다 :이 버그 개방

import 'dart:mirrors'; 
var myList = new List<String>(); 

Map typeArguments = reflect(myList).type.typeArguments; 
print(typeArguments); // {Symbol("T"): ClassMirror on 'String'} 

ClassMirror firstTypeArg = typeArguments[typeArguments.keys.first]; 
print(firstTypeArg.reflectedType); // String