我无法理解Dart镜像中的“isSubtypeOf”是如何工作的

时间:2014-04-06 10:45:57

标签: reflection dart dart-mirrors

根据此测试,我无法使用参数“list”调用方法“method”,因为参数类型与方法参数的类型不兼容。

我的考试错在哪里?

import "dart:mirrors";

void main() {
  var list = new List<String>();
  var listMirror = reflectClass(list.runtimeType);
  // Is "List<String>" subtype of "List<String>"?
  print(listMirror.isSubtypeOf(listMirror));
  // Method with parameter "List<String>"
  var method = (List<String> list) {};
  var closure = reflect(method) as ClosureMirror;
  var function = closure.function;
  var parameter = function.parameters.first;
  // Is "List<String>" subtype of "List<String>"?
  print(parameter.type.isSubtypeOf(listMirror));
  print(listMirror.isSubtypeOf(parameter.type));
  // Invoke method with arg: "List<String>" on param "List<String>"
  method(list);
}

输出:

true
false
false

P.S。

也许我不明白,但它仍然不起作用。

import "dart:mirrors";

void main() {
  var stringMirror = reflectClass(String);
  // Query "List<int> get codeUnits"
  MethodMirror method = stringMirror.declarations.values
      .where((e) => e.simpleName == #codeUnits).first;

  // List<int>
  var returnType = method.returnType;
  print(returnType);

  // List
  var baseType = reflectClass(List);
  print(baseType);

  // List<int> is List
  print(returnType.isSubtypeOf(baseType));
}

输出:

ClassMirror on 'List'
ClassMirror on 'List'
false

1 个答案:

答案 0 :(得分:1)

这条线是罪魁祸首:

var listMirror = reflectClass(list.runtimeType);

它返回

ClassMirror on '_GrowableList'

如果您使用

var listMirror = reflectType(List);

它应该有用。

当您需要在运行时从值中获取类型时,您可以做什么

var listMirror = reflect(list).type.superinterfaces;
...
listMirror.forEach((e) => print(parameter.type.isSubtypeOf(e)));

根据具体情况,您可能需要使用

进行额外检查
reflect(list).type.mixin;

如果其中一项检查为真,则为子类型。