dart - 如何通过反射获取指定类型参数的类型镜像?

标签 dart dart-mirrors

解释问题的示例代码。

import "dart:mirrors";    

void main() {
  var type = getTypeFromDeclaration();
  var typeArguments = getAnotherTypeArguments();
  var myType = reflectType(type, typeArguments);
}

如何通过反射获取指定类型参数的类型镜像?

附注

我认为我不需要解释“为什么需要这个?”因为我们都知道这个功能需要数据水合作用。

这对于使用反射来提高数据一致性的数据编解码器也非常有用。

正如您所注意到的,我不会解释原因。

最佳答案

首先,我同意如果镜像系统允许从 Foo 和 Bar 的类型镜像以及 Map 的类镜像创建 Map 的类型镜像,那将是最好的。目前情况并非如此。

如果没有这个,我认为你无法解决所写的问题。 无法使用编译时未知的类型参数创建参数化类型。

为了完整起见,如果您在编译时知道类型,我将提供一种反射(reflect)参数化类型的方法。如果类型参数可以表示为 Type 对象或 TypeMirror 对象之外的其他内容,则您可以构建自己的表示形式来允许此类操作。

如果您无法使用reflectType(Map<Foo,Baz>)因为Map<Foo,Baz>不是有效的类型文字,有一个小解决方法可以获取任何类型的 Type:拥有一个带有类型参数的类以及获取该参数的 Type 值的方法。

import "dart:mirrors";
class Typer<T> { Type get type => T; }
main() { 
  var mapStringInt = reflectType(new Typer<Map<String,int>>().type);
  print(mapStringInt);                // ClassMirror on 'Map'
  print(mapStringInt.typeArguments);  // [ClassMirror on 'String', ClassMirror on 'int']
  // That is: it's a TypeMirror on Map<String,int>.
}

关于dart - 如何通过反射获取指定类型参数的类型镜像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22980877/

相关文章:

dart - 使用 Polymer 或 Angular 创建测验?

flutter - 在 ListView 中使用具有共享首选项的“收藏夹”按钮

dart - 如何在 Dart 中将映射写入 YAML 文件

dart - 通过元数据标签引用类

dart - 使用镜像访问库内部字段

dart - 如何在Dart类上获取ClassMirror?

dart - 在 Dart 中将类类型作为变量传递

flutter - dart语言中的问号(?)和点号(.)是什么意思?

flutter - Flutter:如何在Firestore中更新阵列中的阵列

serialization - 如何使用序列化包