Есть ли способ узнать, содержит ли класс переменную экземпляра с некоторым известным именем?
При перехвате ошибки из 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.