首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >循环类列表和获取类型实例时访问类的变量

循环类列表和获取类型实例时访问类的变量
EN

Stack Overflow用户
提问于 2022-11-03 15:04:10
回答 1查看 33关注 0票数 0

我有以下Python代码:

代码语言:javascript
运行
复制
def from_json(cls, data: dict, api: Optional[Overpass] = None) -> "Result":
    """
    Create a new instance and load data from json object.

    :param data: JSON data returned by the Overpass API
    :param api:
    :return: New instance of Result object
    """
    result = cls(api=api)
    elem_cls: Type[Union["Area", "Node", "Relation", "Way"]]
    for elem_cls in [Node, Way, Relation, Area]:
        for element in data.get("elements", []):
            e_type = element.get("type")
            if hasattr(e_type, "lower") and e_type.lower() == elem_cls._type_value:
                result.append(elem_cls.from_json(element, result=result))

    return result

我想把这个转换成Dart代码。这就是我想出来的:

代码语言:javascript
运行
复制
factory Result.fromJson(Map<String, dynamic> data, {Overpass? api}) {
    Result result = Result(api: api!);
    Type elemCls;
    for (elemCls in [Node, Way, Relation, Area]) {
      for (Map<String, dynamic> element in data["elements"]) {
        String eType = element["type"];
        if (eType.toLowerCase() == elemCls.typeValue) {
          result.append(elemCls.fromJson(element, result: result));
        }
      }
    }
    return result;
}

我的问题是The getter '_typeValue' isn't defined for the type 'Type'.The method 'fromJson' isn't defined for the type 'Type'.。这是因为_typeValuefromJson属于类NodeWayRelationArea,而不是Type。我需要更改什么才能像Python那样工作呢?

EN

回答 1

Stack Overflow用户

发布于 2022-11-03 21:58:29

你可以做eType.toLowerCase() == elemCls.toString().toLowerCase()。然而,elem_cls.from_json(element, result=result)不能直接在Dart中完成。无法通用地用elemCls类型实例化对象。

相反,您可以创建一个查找表,以便将类型名称映射到构造函数:

代码语言:javascript
运行
复制
final _constructionTable = {
  "node": Node.fromJson,
  "way": Way.fromJson,
  "relation": Relation.fromJson,
  "area": Area.fromJson,
};

factory Result.fromJson(Map<String, dynamic> data, {Overpass? api}) {
    Result result = Result(api: api!);
    for (Map<String, dynamic> element in data["elements"]) {
      String eType = element["type"]!;
      var fromJson = _constructionTable[eType.toLowerCase()];
      if (fromJson != null) {
         result.append(fromJson(element, result: result));
      }
    }
    return result;
}

请注意,这也会更有效,而且它避免了依赖为Dart类型生成的特定字符串。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74305227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档