Как узнать, является ли объект экземпляром класса

Как я могу определить, принадлежит ли объект классу или нет в языке Dart?

Я хочу сделать что-то вроде следующего:

if (someObject.class.toString() == "Num") {
    ...
}

И какой тип возвращаемого значения? Должна ли это быть строка?


Библиотека зеркал то поднималась, то закрывалась, и, похоже, сейчас она подвержена быстрым изменениям, поскольку единственное, что я нашел, просто не работало, как показано.


person george koller    schedule 14.10.2012    source источник


Ответы (3)


  • Используя операторы is и is!, например:

    if (someObject is T)
    

    Из документации:

    Операторы is и is! удобны для проверки типов. Результат obj is T верен, если obj реализует интерфейс, указанный T. Например, obj is Object всегда верно.

  • Используя API зеркал (см. этот пример):

    Expect.equals('T', someObject.simpleName)
    
person Eliran Malka    schedule 14.10.2012
comment
Спасибо! Прекрасно работает. См. быстрый тест ниже: .... bool noteIsString(var note) { return(note is String); } bool test0 = noteIsString(строка); bool test1 = noteIsString(123.45); print(результат test0: $test0); //=› true print(результат теста1: $test1); //=› ложь - person george koller; 14.10.2012

Недавно Object получил runtimeType геттера. Итак, теперь мы можем не только сравнивать тип объекта с другим типом, но и фактически получать имя класса объекта. Как в:

myObject.runtimeType.toString()

Кроме того, в текущей версии Dart теперь вы можете пропустить toString операцию и напрямую сравнить runtimeType объекта с типом цели, как в

myObject.runtimeType == int

or

myObject.runtimeType == Animal
person Vadim Tsushko    schedule 14.10.2012
comment
Можно сравнивать напрямую, используя, например, myObject.runtimeType == int. - person Daniel; 13.11.2014
comment
Есть ли преимущества по сравнению с myObject is int? is также возвращает true, даже если он реализует только другой тип, в некоторых случаях это может быть нежелательным. Иногда упоминалось, что runtimeType ненадежен, поскольку его можно переопределить и использовать только в целях отладки. - person Günter Zöchbauer; 14.11.2014
comment
Я считаю, что равенство с runtimeType дает вам больше динамических возможностей. Например, посмотрите на эту функцию: testType(object,type) => object.runtimeType == type. Вы можете использовать его как testType(myObject,int) Я считаю, что это невозможно с оператором is. Но я должен проверить это, может быть, я ошибаюсь - person Vadim Tsushko; 14.11.2014
comment
Я проверил, моя догадка была верна. Вы не можете передать type literal в качестве параметра функции, а затем использовать его в операции is. Итак, isOfType(obj, Type type) => obj is type неверно, но isOfType(obj, Type type) => obj.runtimeType == type работает хорошо. - person Vadim Tsushko; 15.11.2014
comment
Лучший ответ еще - person Vidor Vistrom; 16.11.2018
comment
Если вы используете dart для Интернета, минифицированный код в js вернет минимизированное значение! - person Zufar Muhamadeev; 18.12.2018

Вот простое объяснение с решением.

У тебя есть:

Object obj =t1;
где t1 — объект класса T.

И у вас есть другой объект T с именем t.

T t = new T();

Как проверить, является ли obj тем же типом, что и t?

Решение:

if(obj is t)
     print('obj is typeof t')
   else print('obj is not typeof t') 
person Martinho Mussamba    schedule 15.10.2020