2016-11-30 73 views
2

我有一个包含大量属性的类,这些属性映射到我在其他地方已解析为Map对象的某些JSON数据。我希望能够通过传入此地图来实例化一个类:从地图创建对象 - Dart

class Card { 
    String name, layout, mana_cost, cmc, type, rarity, text, flavor, artist, 
     number, power, toughness, loyalty, watermark, border, 
     timeshifted, hand, life, release_date, starter, original_text, original_type, 
     source, image_url, set, set_name, id; 

    int multiverse_id; 

    List<String> colors, names, supertypes, subtypes, types, printings, variations, legalities; 
    List<Map> foreign_names, rulings; 

    // This doesn't work 
    Card.fromMap(Map card) { 
    for (var key in card.keys) { 
     this[key] = card[key]; 
    } 
    } 
} 

我宁愿不必手动分配所有内容。有没有办法做我想做的事情?

回答

2

我不认为有一种好的方法可以在语言中完成它。 反射会是一种方法,但在浏览器中避免它会是一种很好的做法,因为它会导致代码膨胀。

还有就是reflectable包限制反射的消极影响大小,并提供几乎相同的功能。

我会使用代码生成方法,在您使用样订做,source_gen工具来生成分配值的代码。

built_value是一个使用该方法的软件包。这甚至可以直接用于你的用例。

+0

或者,您可以将'Map'存储在'this'对象的字段中。唯一的缺点是你需要写'card.props.name'而不是'card.name' – Ganymede