将 Dart @override 元数据反射器与 _Override 的实例进行比较
Compare Dart @override Metadata Reflectee to Instance of _Override
我想举一个例子来说明我们如何在 Dart 中使用反射来搜索 @override 元数据注释。
在我用来学习 dart:mirrors 库和反射的示例中,它们总是在搜索自定义注释。
Here is an example where they search for a custom "Todo" annotation
在搜索自定义注释时,他们只需将元数据的反射体与 class 数据类型进行比较以检查是否匹配。
在下面链接的 Dart 文档中,您可以看到 _Override 实例的示例实现。
Here is Dart documentation on the override constant
这促使我尝试:
if(meta.reflectee is _Override) {
print('Found!);
}
但是无法解析“_Override”,建议不要导入来访问此类数据实例。
我可以将反射对象串起来进行比较,但我觉得这是一个肮脏的解决方案:
if (meta.reflectee.toString() == "Instance of '_Override'") {
print('Found!');
}
使用@override 注释时,我正在努力寻找一种方法将元数据的反射对象与 _Override 的实例类型进行比较。
这是狗 class:
class Dog extends Animal {
Dog(String name) : super(name);
@override
void makeNoise() {
print('Bark, bark!');
}
}
这是我的反射搜索代码:
Dog dog = Dog('Harper');
InstanceMirror instanceMirror = reflect(dog);
ClassMirror classMirror = instanceMirror.type;
classMirror.instanceMembers.forEach((_, member) {
print(member.owner.simpleName);
print(member.simpleName);
print(member.isRegularMethod);
member.metadata.forEach((meta) {
print(meta.reflectee);
if (meta.reflectee is _Override) {
print('Found!');
}
});
});
最后,这是 instanceMembers.forEach 循环到达我感兴趣的方法时的输出:
Symbol("Dog")
Symbol("makeNoise")
true
Instance of '_Override'
使用:
if (meta.reflectee == override) {
print('Found!);
}
或
if (identical(meta.reflectee, override)) {
print('Found!);
}
Dart 常量已规范化,override
对象(私有 _Override
class 的实例)不会覆盖 Object
中的 operator==
,所以这两个表达式做同样的事情。
对于有数据的注解classes,你不知道确切的实例,所以你必须做类型检查。对于像 override
这样只有一个实例的标记注释,您可以与用于注释的确切常量实例进行比较。
我想举一个例子来说明我们如何在 Dart 中使用反射来搜索 @override 元数据注释。
在我用来学习 dart:mirrors 库和反射的示例中,它们总是在搜索自定义注释。
Here is an example where they search for a custom "Todo" annotation
在搜索自定义注释时,他们只需将元数据的反射体与 class 数据类型进行比较以检查是否匹配。
在下面链接的 Dart 文档中,您可以看到 _Override 实例的示例实现。
Here is Dart documentation on the override constant
这促使我尝试:
if(meta.reflectee is _Override) {
print('Found!);
}
但是无法解析“_Override”,建议不要导入来访问此类数据实例。
我可以将反射对象串起来进行比较,但我觉得这是一个肮脏的解决方案:
if (meta.reflectee.toString() == "Instance of '_Override'") {
print('Found!');
}
使用@override 注释时,我正在努力寻找一种方法将元数据的反射对象与 _Override 的实例类型进行比较。
这是狗 class:
class Dog extends Animal {
Dog(String name) : super(name);
@override
void makeNoise() {
print('Bark, bark!');
}
}
这是我的反射搜索代码:
Dog dog = Dog('Harper');
InstanceMirror instanceMirror = reflect(dog);
ClassMirror classMirror = instanceMirror.type;
classMirror.instanceMembers.forEach((_, member) {
print(member.owner.simpleName);
print(member.simpleName);
print(member.isRegularMethod);
member.metadata.forEach((meta) {
print(meta.reflectee);
if (meta.reflectee is _Override) {
print('Found!');
}
});
});
最后,这是 instanceMembers.forEach 循环到达我感兴趣的方法时的输出:
Symbol("Dog")
Symbol("makeNoise")
true
Instance of '_Override'
使用:
if (meta.reflectee == override) {
print('Found!);
}
或
if (identical(meta.reflectee, override)) {
print('Found!);
}
Dart 常量已规范化,override
对象(私有 _Override
class 的实例)不会覆盖 Object
中的 operator==
,所以这两个表达式做同样的事情。
对于有数据的注解classes,你不知道确切的实例,所以你必须做类型检查。对于像 override
这样只有一个实例的标记注释,您可以与用于注释的确切常量实例进行比较。