Generics 如何使用Dart中的镜像获取泛型类型变量的具体类型?
假设我有一个像这样的Generics 如何使用Dart中的镜像获取泛型类型变量的具体类型?,generics,dart,dart-mirrors,Generics,Dart,Dart Mirrors,假设我有一个像这样的字符串的列表 var myList=new List(); 我怎样才能知道myList是一个列表,由字符串组成,使用镜像 我使用ClassMirror的typeVariables尝试了它,但是mirror似乎只是描述了gernericList类 InstanceMirror im=reflect(myList);//“列表”实例上的InstanceMirror ClassMirror cm=im.type;//“列表”上的ClassMirror 打印(cm.typeVar
字符串的列表
var myList=new List();
我怎样才能知道myList
是一个列表
,由字符串
组成,使用镜像
我使用ClassMirror
的typeVariables
尝试了它,但是mirror似乎只是描述了gernericList
类
InstanceMirror im=reflect(myList);//“列表”实例上的InstanceMirror
ClassMirror cm=im.type;//“列表”上的ClassMirror
打印(cm.typeVariables['E'])//在'E'上打印TypeVariableMirror
我在文档中也发现了这一点,但是我还没有找到一个ClassMirror
实例,在这个实例中,访问originalDeclaration
不会抛出NoSuchMethodError
最终类镜像原始声明
此类型的原始声明上的镜像
对于大多数类,它们是它们自己的原始声明。通用的
但是,类与原始类之间有区别
声明,其中包含未绑定的类型变量和实例化
具有绑定类型变量的泛型类的
2种可能的方法
第一种方法是使用is
运算符检查变量的类型,因为它比反射更有效:
var myList = new List<String>();
print(myList is List<int>); // false
print(myList is List<String>); // true
var myList=new List();
打印(我的列表是列表);//假的
打印(我的列表是列表);//真的
第二种方法是使用:
导入“dart:mirrors”;
var myList=新列表();
Map typeArguments=reflect(myList).type.typeArguments;
打印(类型参数);//{Symbol(“T”):字符串上的类镜像}
ClassMirror firstTypeArg=typeArguments[typeArguments.keys.first];
打印(firstTypeArg.reflectedType);//一串
FWIW我打开了这个bug来跟踪:您可能想启动它,以便在发生变化时获得通知。注意,您的示例应该更准确,并以此为例:var myList=new List()
因为在Dart中,类型是可选的,所以您希望显示实际的对象实例化。@SethLadd谢谢您的回答。我相应地改变了我的例子。所以我猜答案应该是“在bug修复之前不可能实现”?那么这不应该是(被接受的)答案吗?我不完全肯定这是一个bug。一旦我们看到错误被分类并响应,我们就会知道答案:)
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