如何使用镜像获取声明类型?

时间:2014-02-17 19:39:40

标签: dart dart-mirrors

import 'dart:mirrors';


void main() {
  var mirror = reflectClass(MyClass);
  mirror.declarations.forEach((k, v){
    print(k);
    if(v is VariableMirror){
      print(v.type);
    }
  });
}


class MyClass{
  var aDynamic;
  int anInt;
}

//prints:
Symbol("aDynamic")
TypeMirror on 'dynamic'
Symbol("anInt")
ClassMirror on 'int'
Symbol("MyClass")

有没有办法可以获得TypeMirror重新提取的类型,所以我想在上面的示例中为2个属性返回dynamic类型和int类型?

1 个答案:

答案 0 :(得分:4)

VariableMirror.type是正确的方法。如果它返回ClassMirror,那么您可以使用ClassMirror.reflectedType来获取声明的Type对象。

VariableMirror.type将是变量的声明的类型,而不是变量保存的任何值的类型,因此虽然它是TypeMirror,但它可能不是ClassMirror。它也可以是TypeVariableMirror或TypedefMirror。您可以在输出中看到动态案例的镜像是dynamic上的TypeMirror。所以你必须弄清楚如何处理这些。例如,没有表示dynamic的Type对象,因此您必须单独处理它。我可能只是将其转换为Object。对于TypedefMirrors,您可以返回Function。我真的不确定那些不属于子类型的其他TypeMirrors。

以下是一些示例代码:

final _dynamicType = reflectType(dynamic);

Type getDeclaredType(VariableMirror m) {
  var t = m.type;
  if (t is ClassMirror) return t.reflectedType;
  if (t is TypedefMirror) return Function;
  if (t == _dynamicType) return Object;
  throw new ArgumentError("I don't know how to handle ${t}");
}