有没有Dart函数可以检查对象是否具有特定的属性或方法?

23

问题:

i)在检查Dart中的普通Class对象是否具有特定属性时应该怎么做?

ii)解码来自api的JSON响应正文时,如何检查一个对象是否具有特定属性,在DART中?

例如,在Javascript中,有"hasOwnProperty"。

if (obj.hasOwnProperty('property')) {
    // do something
}
2个回答

22
您可以使用bool containsKey(Object key);。有关更多信息,请查看文档。此外,您还可以在此处找到相关的帖子
if (obj.containsKey('property')) {
    // do something
}

非常感谢。是的,在解码JSON响应时非常有用。但我也指的是在Dart中的普通类对象中。 在Python中,我认为我们有**hasattr()**函数。 - RahZun
是的,但是由于你询问了JSON响应体,我没有考虑过PODO。 - Doruk Eren Aktaş
1
但是这很有帮助。谢谢!!我想我应该稍微修改一下我的问题。 - RahZun

9
Dart是强类型语言;在调用方法之前,您应该检查Object是否是所需类型:
if (obj is ClassWithProperty) {
  print(obj.property);
}

我不建议这样做,但你可以通过使用 "dynamic" 类型来禁用类型检查:
var hasProperty = false;
try {
  (obj as dynamic).property;
  hasProperty = true;
} on NoSuchMethodError {
}

捕获Error类型是不受欢迎的

1
如何检查对象是否为映射(无论其键/值的类型如何,即<String,String>)?is运算符似乎会返回带有<>的类型,这使它成为不同的类型。 - Muhammad Qasim
@MuhammadQasim 你可以通过 object is Map (它是 object is Map <dynamic,dynamic>的简写形式)来检查一个对象是否为 Map - jamesdlin
啊,我的错。刚意识到我在比较runtimeType而不是对象本身,这导致了错误的结果,像这样: var obj = {"abc": 123}; if(obj.runtimeType is Map) 谢谢你的帮助。 - Muhammad Qasim
不幸的是,在Dart中第一种解决方案并不总是有效的。 - MwBakker
@MwBakker 请详细说明。第一种方法应该可行。您应该确保在本地变量上使用is,因为只有本地变量才会自动进行类型提升。 - jamesdlin
你应该确保你使用的是本地变量,这就解释了为什么我在这种情况下不得不强制转换。谢谢。 - MwBakker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接