如何使用Dart中的镜像获取泛型类型变量的具体类型?

时间:2013-01-17 17:36:27

标签: generics dart dart-mirrors

假设我有List String这样的话。

var myList = new List<String>();

如何使用镜像判断myListList String个?{/ p>


我使用typeVariables的{​​{1}}进行了尝试,但镜像似乎只是描述了通用ClassMirror类。

List

我在文档中也发现了这一点,但我还没有找到InstanceMirror im = reflect(myList); // InstanceMirror on instance of 'List' ClassMirror cm = im.type; // ClassMirror on 'List' print(cm.typeVariables['E']) // TypeVariableMirror on 'E' 实例,其中访问ClassMirror不会引发originalDeclaration

  

final ClassMirror originalDeclaration

     

此类型原始声明的镜像。

     

对于大多数课程,他们是他们自己的原始声明。对于通用   但是,类在原始类之间存在区别   声明,具有未绑定的类型变量和实例化   泛型类,具有绑定类型变量。

1 个答案:

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