2

問題を説明するサンプル コード。

import "dart:mirrors";    

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

リフレクションを介して指定された型引数を持つ型ミラーを Dart に取得する方法は?

PS

「なぜこれが必要なのか」という説明は不要だと思います。この機能がデータハイドレーションに必要であることは誰もが知っているからです。

また、これは、データの一貫性を高めるためにリフレクションを使用したデータ コーデックでも非常に役立ちます。

お気づきのように、理由は説明しません。

4

1 に答える 1

2

まず、ミラー システムが Foo と Bar の型ミラーと Map のクラス ミラーから Map の型ミラーを作成できるようにすることが最善であることに同意します。現在はそうではありません。

それがなければ、書かれているように問題を解決することはできないと思います。コンパイル時に型として認識されない型引数を持つパラメーター化された型を作成する方法はありません。

完全を期すために、コンパイル時に型がわかっている場合は、パラメーター化された型を反映する方法を含めます。型引数を 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>.
}
于 2014-04-10T08:13:37.583 に答える