有没有办法查询一个类是否包含一个具有某个已知名称的实例变量?

时间:2014-02-23 20:36:52

标签: mysql dart dart-mirrors

当拦截来自MySql的错误时,事先不知道传递给我的错误类的内容是什么。所以我编码:

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

在这个特定情况下,我想知道e是否包含实例变量osErrorsqlState,因为它们中的任何一个都包含特定的错误代码。更一般地说(为了提高我的知识)是否可以编写类似if (firstError.instanceExists(osError)) ...的内容,以及如何编写?

2 个答案:

答案 0 :(得分:1)

这应该做你想要的:

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;

答案 1 :(得分:1)

Günter的答案正确显示了如何使用镜像,但是对于您的特定用例,我建议使用“is”检查而不是镜像。我不知道具体的mysql API,但它看起来像这样:

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

或许请James Ots的作者sqljocky寻求建议。