3
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

4

1 回答 1

4

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

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

这是一些示例代码:

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}");
}
于 2014-02-17T21:44:35.157 回答