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 が反映している Type を取得する方法はありますか? 上記の例の 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 に答える