Есть ли способ узнать, содержит ли класс переменную экземпляра с некоторым известным именем?

При перехвате ошибки из MySql заранее неизвестно, каким будет содержимое класса ошибок, переданного мне. Итак, я кодирую:

.catchError((firstError) {
  sqlMessage = firstError.message; 
  try {        
    sqlError = firstError.osError;
  } catch (noInstanceError){
    sqlError = firstError.sqlState;
  }
});

В этом конкретном случае я хотел бы знать, содержит ли e переменную экземпляра osError или же sqlState, так как любой из них содержит определенный код ошибки. И еще в целом (для улучшения моих знаний) можно было бы написать что-то вроде if (firstError.instanceExists(osError)) ..., и как?

2 ответа

Решение

Это должно делать то, что вы хотите:

import 'dart:mirrors';

...

// info about the class declaration
reflect(firstError).type.declarations.containsKey(#osError);

// info about the current instance
var m = reflect(firstError).type.instanceMembers[#osError];
var hasOsError = m != null && m.isGetter;

Ответ Гюнтера правильно показывает, как использовать зеркала, однако для вашего конкретного случая использования я бы рекомендовал использовать проверку "есть" вместо зеркал. Я не знаю API MySQL, но это может выглядеть примерно так:

.catchError((error) {
   sqlMessage = error.message;
   if (error is MySqlException) {
     sqlError = error.sqlState;
   } else if (error is OSError) {
     sqlError = error.errorCode;
   }
})

Возможно, спросите совета у Джеймса Отса, автора sqljocky.

Другие вопросы по тегам