3

假设我有一个这样List的。String

var myList = new List<String>();

我如何使用镜子找出那myList是 a Listof s?String


我尝试使用typeVariablesofClassMirror但镜子似乎只是描述了通用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不会抛出NoSuchMethodError.

final ClassMirror 原声明

这种类型的原始声明的镜像。

对于大多数类,它们是它们自己的原始声明。然而,对于泛型类,具有未绑定类型变量的原始类声明与具有绑定类型变量的泛型类的实例化之间存在区别。

4

1 回答 1

8

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
于 2013-09-23T14:09:35.430 回答