Как я могу получить конкретный тип переменной универсального типа с помощью зеркал в Dart?

Предполагая, что у меня есть List из String таких.

var myList = new List<String>();

Как я могу определить, что myList - это List из String, использующих зеркала?


Я пробовал использовать typeVariables из 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 экземпляр, где доступ к originalDeclaration не вызывает NoSuchMethodError.

final ClassMirror originalDeclaration

Зеркало на исходной декларации этого типа.

Для большинства классов это их собственное исходное объявление. Однако для универсальных классов существует различие между объявлением исходного класса, которое имеет несвязанные переменные типа, и экземплярами универсальных классов, которые имеют связанные переменные типа.


person Thomas W.    schedule 17.01.2013    source источник
comment
FWIW Я открыл эту ошибку, чтобы отслеживать: code.google.com/p/ dart / issues / detail? id = 7957 Вы можете включить его, чтобы получать уведомления, когда что-то меняется.   -  person Seth Ladd    schedule 17.01.2013
comment
Обратите внимание, что ваш пример должен быть более точным и использовать его в качестве примера: var myList = new List<String>(), потому что в Dart типы не являются обязательными, поэтому вы хотите показать фактическое создание объекта.   -  person Seth Ladd    schedule 17.01.2013
comment
@SethLadd Спасибо за ответ. Я соответственно изменил свой пример. Думаю, ответ будет невозможен, пока эта ошибка не будет исправлена? Разве тогда не должен быть здесь (принятый) ответ?   -  person Thomas W.    schedule 18.01.2013
comment
Я не совсем уверен, что это ошибка. Как только мы увидим, что ошибка была отсортирована и на которую мы отреагировали, мы узнаем наш ответ :)   -  person Seth Ladd    schedule 19.01.2013


Ответы (1)


2 возможных метода.

Первый способ - проверить тип переменной с помощью оператора is, так как он более эффективен, чем отражение:

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

Второй способ - использовать 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
person CedX    schedule 23.09.2013