在Dart(2.15.0)中,我试图通过定义toJson方法将jsonEncode与枚举一起使用。它不起作用。
import 'dart:convert';
enum Day { monday, tuesday }
extension ParseToJsonString on Day {
String toJson() {
return this.toString().split('.').last;
}
}
class Saturday {
String toJson() => "WOOHOO Saturday";
}
main() {
//works!
Saturday s=Saturday();
print(s.toJson());
print(jsonEncode(s));
Day m = Day.monday;
print(m.toJson()); //prints 'monday'
print(m); //prints Day.monday
print(jsonEncode(m)); // Uncaught Error: Converting object to an encodable object failed: Instance of 'Day'
}
根据文档,jsonEncode
将查找toJson()
方法。
当直接在枚举上调用时,扩展可以工作,但是不知何故jsonEncode没有找到toJSON。
Dart如何获取枚举的“值”https://dart.dev/guides/language/extension-methods
知道这是一个错误还是预期的行为吗?
否则,我可以使用枚举并以某种方式定义一些与jsonEncode一起使用的东西吗?
谢谢!
我做了一些调查,由于jsonEncode的工作方式,这是正确的行为。
看见https://github.com/dart-lang/sdk/issues/42742
请注意,即使使用 jsonEncode 的可选参数也无法修复它:
print(jsonEncode(m, toEncodable: (x)=>x!.toJson()) ); // won't work.
为了克服“扩展不适用于动态类型”的问题,我们还必须使用重铸:
print(jsonEncode(
m,
toEncodable: (x) {
Day recastX = x as Day;
return recastX.toJson();
},
)); // works, prints 'monday'
在Dartpad上看到它
问题内容: 我有一个枚举,我们称它为A: 我有一个需要枚举A的函数: 如何创建另一个枚举,可能调用B并传递给 functionA ?像这样吗 我知道您无法扩展枚举,但是我还有哪些其他选择?实现此目标的最佳方法是什么? 问题答案: 你不能 枚举类型在设计上是最终的。 原因是每个枚举类型都应 仅 具有 在枚举中声明的元素 (例如,我们可以在switch语句中使用它们),如果允许扩展类型,则不可能。 您
所以我正在做一个需要xml模式的小项目,我对这个模式很不熟悉。 我希望能够设置模式以在两组属性之间进行选择,根据我的研究,这在XSD 1.0中是不可能的,但显然是XSD 1.1的一个特性。 目前我正在使用VisualStudio来完成我的工作,它似乎被困在XSD1.0模式中,这是有意义的,因为XSD1.1显然是一个最新的开发。 我的问题是,是否有一个插件/扩展可以让我在Visual Studio中
问题内容: 我想知道为什么在Java语言中a 不能扩展。 我不是在谈论一个延伸的(这不能做,因为Java没有多重继承,而Š隐含延长),但一类的以只添加额外的方法,而不是额外的枚举值。 就像是: 要这样使用: 因此,有人可以对此限制提供理由(或将我指向正确的JLS部分)吗? 问题答案: 我认为 他们这样做 的答案来自以下问题: 在您的示例中,如何实例化MyClass?用户永远不会(通过)显式实例化枚
Electron 支持 Chrome 扩展API的子集, 主要是支持 DevTools 扩展和 Chromium-internal 扩展,但它同时也支持一些其他扩展能。 注意:Electron 不支持商店中的任意 Chrome 扩展,Electron 项目的目标不是与 Chrome 的扩展实现完全兼容。 加载扩展 Electron 只支持加载未打包的扩展 (即不能使用 .crx 文件)。 插件会被
问题内容: 假设我有以下情况: 有没有一种方法可以保证实现的任何类也必须扩展?我不想创建一个抽象类,因为我希望能够以类似的方式混合其他一些接口。 例如: 问题答案: Java接口无法扩展类,这很有意义,因为类包含无法在接口内指定的实现细节。 解决此问题的正确方法是通过将接口也完全从实现中分离出来。所述等可以扩展接口以迫使程序员来实现相应的方法。如果要在所有实例之间共享代码,则可以将(可能是抽象的)
我有一个非常简单的练习,我注册客户端名称(字符串),我使用数组来做到这一点,所以当我添加一个新的我将使用另一个辅助数组,然后增加原来的长度,或者我将使用System.array复制,有没有其他方法,逐渐增加数组长度,因为你需要添加元素到该数组,不涉及辅助数组?