您将如何将 Map 转换为 dart 的对象

How would you translate a Map to and object for dart

假设我想重构我的代码以便更容易阅读,并且我有一个类型为 Map 的对象 属性 什么是转换此 属性 到另一个对象?当它是地图时,我可以使用它的 String 键调用相关对象。如果它成为另一个对象,我将如何调用我想要的对象?

例如:

class A1{
 Map<String,B1> property;
}

to:

class A1{
 List<B2> property;
}

class B2{
String key;
B1 property;
}

在上面的示例中,为了获得 属性 我想要的,我必须过滤 key = keyIwant 的列表,而如果它是一个地图,我可以调用 map[key]。有什么有效的方法可以将地图转换为对象吗? Dart是我用的技术

我想您正试图通过将当前的 Map 替换为其他内容来使您的代码更易于维护,您将其称为 object.

我还假设 object 是指带有类型化字段的 Dart 类。

如果您希望继续能够通过字符串名称查找“对象”,则无法避免使用 Map

如果“键”在 compile-time(即在您的程序实际运行之前)都是已知的,那么您可以使用类型化对象,这是您应该更喜欢的,因为它使推理和组织代码变得更加容易.

假设您知道您的地图将永远只有键 ab,类型分别为 AB。然后你就可以轻松更换你的地图了:

class A {}
class B {}
class MyClass {
  final A a;
  final B b;
  MyClass(this.a, this.b);
}

简单。

如果某些“键”可能不存在,只需将它们转换为可为空的值即可:

class A {}
class B {}
class MyClass {
  final A? a;
  final B? b;
  // passing a or b is now optional!
  MyClass({this.a, this.b});
}

如果您根本不知道按键是什么,那么就没有办法使用 Map。这就是他们的目的。

虽然 Dart 支持动态类型,但您可以“假设”某些键将具有某些类型。因此,虽然这通常不利于代码维护,因为无法在程序运行之前对其进行分析(即它可能会在运行时崩溃),但您可以这样做:

class Foo {
  final String a;
  Foo(this.a);
  String toString() => 'Foo($a)';
}

class Bar {
  final String a;
  Bar(this.a);
  String toString() => 'Bar($a)';
}

// example usage
void main() {
  Map<String, dynamic> map = {'foo': Foo('a foo')};

  Foo foo = map['foo'];
  print(foo); // ok!

  Bar? bar = map['bar'];
  print(bar); // null
}

希望这有助于阐明何时应使用“对象”以及何时需要使用地图。