如何检查元素是否是使用 dart 中的命名构造函数创建的?
How do I check if an element was created with a named constructor in dart?
我想知道是否可以检查我在 dart 的 if 语句中使用哪个构造函数创建了创建的元素。
我想做的一个简单例子:
class Employee {
int id;
String name;
String title;
Employee.id(this.id);
Employee.name(this.name);
Employee.title(this.title);
}
现在我的代码中有一个 if 语句,想检查我是否使用了构造函数 Employee.id。在这种情况下,我会做一些事情,就像这样:
Employee e = new Employee.id(1)
//check if e was created with Employee.id constructur
if (e == Emploee.id) {
print(e.id)
} else {
print("no id")
}
有办法吗?谢谢你的回答。
你可以定义私有枚举属性让你这样设置私有信息,稍后用函数打印出来。也不要忘记用 factory
.
标记你的构造函数
enum _ConstructorType {
Identifier,
Name,
Title,
}
class Employee {
int id;
String name;
String title;
_ConstructorType _constructorType;
factory Employee.id(id) {
return Employee._privateConstructor(_ConstructorType.Identifier, id: id);
}
factory Employee.name(name) {
return Employee._privateConstructor(_ConstructorType.Name, name: name);
}
factory Employee.title(title) {
return Employee._privateConstructor(_ConstructorType.Title, title: title);
}
Employee._privateConstructor(this._constructorType,
{this.id, this.name, this.title});
String constructorDescription() {
return this._constructorType.toString();
}
}
如果您需要的信息不是字符串形式,而是枚举形式,您可以随时删除其上的下划线,并使此信息 public 供您在 class 之外使用。
您可以使用 freezed 包将您的 class 变成 Union type
并使用如下所示的折叠方法查看使用的构造函数:
import 'package:freezed_annotation/freezed_annotation.dart';
part 'tst.freezed.dart';
@freezed
abstract class Employee with _$Employee {
const factory Employee.id(int id) = IdEmployee;
const factory Employee.name(String name) = NameEmployee;
const factory Employee.title(String title) = TitleEmployee;
}
void main() {
Employee employee1 = Employee.id(0);
Employee employee2 = Employee.name('some name');
Employee employee3 = Employee.title('some title');
employee1.when(
id: (int id) => print('created using id contsrutor and id= $id'),
name: (String name) => print('created using name const and name = $name'),
title: (String title)=>print('created using title const and title = $title'),
);//prints the first statement
employee2.when(
id: (int id) => print('created using id contsrutor and id= $id'),
name: (String name) => print('created using name const and name = $name'),
title: (String title)=>print('created using title const and title = $title'),
);//prints the second statement
employee3.when(
id: (int id) => print('created using id contsrutor and id= $id'),
name: (String name) => print('created using name const and name = $name'),
title: (String title)=>print('created using title const and title = $title'),
);//prints the third statement
print(employee1 is IdEmployee);
print(employee1 is NameEmployee);
}
输出将是:
created using id contsrutor and id= 0
created using name const and name = some name
created using title const and title = some title
true
false
我想知道是否可以检查我在 dart 的 if 语句中使用哪个构造函数创建了创建的元素。
我想做的一个简单例子:
class Employee {
int id;
String name;
String title;
Employee.id(this.id);
Employee.name(this.name);
Employee.title(this.title);
}
现在我的代码中有一个 if 语句,想检查我是否使用了构造函数 Employee.id。在这种情况下,我会做一些事情,就像这样:
Employee e = new Employee.id(1)
//check if e was created with Employee.id constructur
if (e == Emploee.id) {
print(e.id)
} else {
print("no id")
}
有办法吗?谢谢你的回答。
你可以定义私有枚举属性让你这样设置私有信息,稍后用函数打印出来。也不要忘记用 factory
.
enum _ConstructorType {
Identifier,
Name,
Title,
}
class Employee {
int id;
String name;
String title;
_ConstructorType _constructorType;
factory Employee.id(id) {
return Employee._privateConstructor(_ConstructorType.Identifier, id: id);
}
factory Employee.name(name) {
return Employee._privateConstructor(_ConstructorType.Name, name: name);
}
factory Employee.title(title) {
return Employee._privateConstructor(_ConstructorType.Title, title: title);
}
Employee._privateConstructor(this._constructorType,
{this.id, this.name, this.title});
String constructorDescription() {
return this._constructorType.toString();
}
}
如果您需要的信息不是字符串形式,而是枚举形式,您可以随时删除其上的下划线,并使此信息 public 供您在 class 之外使用。
您可以使用 freezed 包将您的 class 变成 Union type
并使用如下所示的折叠方法查看使用的构造函数:
import 'package:freezed_annotation/freezed_annotation.dart';
part 'tst.freezed.dart';
@freezed
abstract class Employee with _$Employee {
const factory Employee.id(int id) = IdEmployee;
const factory Employee.name(String name) = NameEmployee;
const factory Employee.title(String title) = TitleEmployee;
}
void main() {
Employee employee1 = Employee.id(0);
Employee employee2 = Employee.name('some name');
Employee employee3 = Employee.title('some title');
employee1.when(
id: (int id) => print('created using id contsrutor and id= $id'),
name: (String name) => print('created using name const and name = $name'),
title: (String title)=>print('created using title const and title = $title'),
);//prints the first statement
employee2.when(
id: (int id) => print('created using id contsrutor and id= $id'),
name: (String name) => print('created using name const and name = $name'),
title: (String title)=>print('created using title const and title = $title'),
);//prints the second statement
employee3.when(
id: (int id) => print('created using id contsrutor and id= $id'),
name: (String name) => print('created using name const and name = $name'),
title: (String title)=>print('created using title const and title = $title'),
);//prints the third statement
print(employee1 is IdEmployee);
print(employee1 is NameEmployee);
}
输出将是:
created using id contsrutor and id= 0
created using name const and name = some name
created using title const and title = some title
true
false