动态型落镖/Flutter铸造

imzjd6km  于 2023-02-16  发布在  Flutter
关注(0)|答案(2)|浏览(125)

我正在写一个库来动态序列化/反序列化Dart/Flutter中的任何对象(在思想上类似于Python的Pydantic)。然而,我发现不可能实现最后一个组件,动态类型转换。这是从JSON转换类型所必需的,比如List到List(或类似的)。类型是使用反射从对象中检索的。
下面是所需的实现(尽管据我所知,这在Dart中是不可能的)。

Map<String, Type> dynamicTypes = {"key": int };

// Regular casting would be "1" as int
int value = "1" as dynamicTypes["key"];

有没有什么变通的方法可以实现它?或者我已经走到了死胡同(因此没有其他动态序列化/反序列化包已经存在)。

4uqofj5v

4uqofj5v1#

对这个问题进行更多的研究,在Dart的当前实现中,这似乎是不可能的,因为运行时反射被禁用,如官方文档中所引用的。
关于GitHub上对这一功能和相关包dart:mirror here的支持,目前正在进行讨论,但到目前为止,尽管有一些人希望实现这一功能,但它几乎不可能实现。
因此,唯一的选择是:

  • 使用代码生成库生成方法。
  • 手动序列化/反序列化方法。
  • 实现具有复杂类型(如列表和Map)的类,使其成为动态的,从而支持(所有都是有限的)自动序列化/反序列化。
t3irkdon

t3irkdon2#

您的问题没有说明dynamicTypes是如何构建的,或者它的密钥是如何导出的,所以可能有一个细节我还不清楚。
但是像这样的事情呢?

class Caster<T> {
  final T Function(String) fromString;
  Caster(this.fromString);
}

void main() {
  Map<String, Caster> dynamicTypes = { "key": Caster<int>((s) => int.parse(s)) };
  int v = dynamicTypes['key']!.fromString('1');
  print(v);
}

或者,如果值为dynamic而不是字符串:

class Caster<T> {
  T cast(dynamic value) => value as T;
}

void main() {
  Map<String, Caster> dynamicTypes = { "key": Caster<int>() };
  dynamic a = 1;
  int v = dynamicTypes['key']!.cast(a);
  print(v);
}

或者更简洁地说:

void main() {
  dynamic a = 1;
  int v = a;
  print(v);
}

相关问题