3

Listこのようなofがあると仮定Stringします。

var myList = new List<String>();

ミラーを使用して sでmyListあることをどのように把握できますか?ListString


typeVariablesofを使用してみましたが、ミラーは一般的なクラスClassMirrorを記述しているようです。List

InstanceMirror im = reflect(myList); // InstanceMirror on instance of 'List'
ClassMirror cm = im.type; // ClassMirror on 'List'
print(cm.typeVariables['E']) // TypeVariableMirror on 'E'

ドキュメントでもこれを見つけましたが、アクセスしても がスローされないClassMirrorインスタンスをまだ見つけていません。originalDeclarationNoSuchMethodError

final ClassMirror originalDeclaration

この型の元の宣言のミラー。

ほとんどのクラスでは、それらは独自の独自の宣言です。ただし、ジェネリック クラスの場合、バインドされていない型変数を持つ元のクラス宣言と、バインドされた型変数を持つジェネリック クラスのインスタンス化には違いがあります。

4

1 に答える 1

8

2つの可能な方法。

is最初の方法は、リフレクションよりもパフォーマンスが高いため、演算子を使用して変数の型を確認することです。

var myList = new List<String>();
print(myList is List<int>); // false
print(myList is List<String>); // true

2 番目の方法は、ClassMirror.typeArgumentsを使用することです。

import 'dart:mirrors';
var myList = new List<String>();

Map typeArguments = reflect(myList).type.typeArguments;
print(typeArguments); // {Symbol("T"): ClassMirror on 'String'}

ClassMirror firstTypeArg = typeArguments[typeArguments.keys.first];
print(firstTypeArg.reflectedType); // String
于 2013-09-23T14:09:35.430 に答える