我想从 Type 中定义的对象类型或从 String 中定义的对象名称创建对象。下面的示例使用 String 来保存对象类型。但是我认为这不是那么优雅-即使使用 Type ,对于许多对象类型,如果if块也会急剧增加...
我还没有找到更好的解决方案。如何从指定的对象类型动态创建该对象?
if (model == 'Event') {
data = Event.fromMap(result);
}
else if (model == 'Content') {
data = Content.fromMap(result);
}
else if (...) {
// ...
}
答案 0 :(得分:1)
这是另一种方法。
class Event{
Event.fromMap(_map){
print('This is an event');
print(_map);
}
}
class Content{
Content.fromMap(_map){
print('This is a content');
print(_map);
}
}
Map<String, Function> types = {
'Event' : (_map)=>Event.fromMap(_map),
'Content' : (_map)=>Content.fromMap(_map),
};
void main() {
var a = types['Event']({'test':'success_event'});
print(a.runtimeType);
var b = types['Content']({'test':'success_content'});
print(b.runtimeType);
}
它更具可扩展性(因为仅取决于将类构造函数添加到地图中)。
说明:
class Event{
Event.fromMap(_map){
print('This is an event');
print(_map);
}
}
class Content{
Content.fromMap(_map){
print('This is a content');
print(_map);
}
}
在这里,我们正在创建测试类。没什么重要的。
Map<String, Function> types = {
'Event' : (_map)=>Event.fromMap(_map),
'Content' : (_map)=>Content.fromMap(_map),
};
在这里,我们正在定义Map
。为什么?因为它允许我们在恒定时间内通过某个键访问某些值。在这种情况下,键是字符串“事件”,“内容”,也可以是您想要的类型。为了简单起见,让它们为Strings。值是Function
,在此示例中仅作为参数_map
获得(因为示例中的Class构造函数需要一个参数_map
)。因此,如果需要更多类型,只需添加类型和封装该类型的构造函数的函数即可。
void main() {
var a = types['Event']({'test':'success_event'});
print(a.runtimeType);
var b = types['Content']({'test':'success_content'});
print(b.runtimeType);
}
最后,您可以轻松地实例化类。仅在使用字符串类型并将所需的值传递给函数时(在此示例中,键为“ test”的映射)。
在您的示例中,类似于:
data = types[model](result);