我有以下三种方法:
func1() async {
...
var list = (response['contents'] as List).map((i) => Quotation.fromJson(i)).toList();
...
} // has 20 lines
func2() async {
...
var list = (response['contents'] as List).map((i) => Delivery.fromJson(i)).toList();
...
} // has 20 lines
func3() async {
...
var list = (response['contents'] as List).map((i) => Discovery.fromJson(i)).toList();
...
} // has 20 lines
现在我想添加一个参数来概括SomeClass.fromJson(i)
所以代码会像这样
generalFunc( someType SomeClass ) async {
...
var list = (response['contents'] as List).map((i) => SomeClass.fromJson(i)).toList();
...
}
... call generalFunc(Quotation) // reduce 19 lines
... call generalFunc(Delivery) // reduce 19 lines
... call generalFunc(Discovery) //reduce 19 lines
我如何做到这一点?谢谢..
当声明参数someType SomeClass
时,您期望的对象是SomeClass
。如果这是您想要的,则可以声明dynamic
类型的参数。
请参见下面的代码:
generalFunc( generic SomeClassObject ) async {
...
var list = (response['contents'] as List).map((i) => SomeClassObject.fromJson(i)).toList();
...
}
... call generalFunc(quotationObject) // reduce 19 lines
... call generalFunc(deliveryObject) // reduce 19 lines
... call generalFunc(discoveryObject) //reduce 19 lines
但是,如果您想通过课程,那是不可能的。但是您可以通过将参数作为类的选择器来解决。
请参见下面的代码:
enum SomeClass {
Quotation,
Delivery,
Discovery
}
generalFunc({ SomeClass someClass }) async {
...
var list;
if(someClass == SomeClass.Quotation){
list = (response['contents'] as List).map((i) => Quotation.fromJson(i)).toList();
}
else if(someClass == SomeClass.Discovery) {
list = (response['contents'] as List).map((i) => Discovery.fromJson(i)).toList();
}
else if(someClass == SomeClass.Delivery) {
list = (response['contents'] as List).map((i) => Delivery.fromJson(i)).toList();
}
...
}
... call generalFunc(someClass: SomeClass.Delivery);
... call generalFunc(someClass: SomeClass.Discovery);
... call generalFunc(someClass: SomeClass.Qoutation);