颤振:从类型或字符串创建对象



我想从"类型">中定义的对象类型或"字符串"中定义的对象名称创建对象。下面的示例使用String来保存对象类型。但我认为这不是那么优雅 - 即使使用Type,对于许多对象类型,这个 if 块也会急剧增加......

我还没有找到更好的解决方案。如何从指定的对象类型动态创建该对象?

if (model == 'Event') {
data = Event.fromMap(result);
}
else if (model == 'Content') {
data = Content.fromMap(result);
}
else if (...) {
// ...
}

这是另一种方法。

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.为什么?因为它允许我们在恒定时间内通过某个键访问一些值。在这种情况下,键是字符串"事件","内容",但也可以根据需要键入。为简单起见,让它们成为字符串。这些值是Function的,在此示例中仅获取参数 a_map(因为示例中的类构造函数需要一个参数_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);

我也遇到了类似的问题。这是我修复它的方法:

创建类的对象:

class a{ 
a.fromMap(_map){}}
class b{
b.fromMap(_map){}}
Map<String,Dynamic> obj (){
return { 
"a":a,
"b":b}

现在我们可以利用 obj 对象来执行所需的操作

希望这有帮助

最新更新