飞镖代码:
class User() {
static onmystatic() {
printCurrentType(); // should print: User
}
}
注意printCurrentType()
类中的User
,是否可以实现它?我试过this.runtimeType
了,但它提醒我this
不在范围内。
由于onmystatic()
是静态的,它调用的任何函数都必须是静态的(或某个对象的实例方法),所以我假设printCurrentType()
也是静态的。由于静态方法不能被覆盖,类型是常量,你可以写:
class User {
static onmystatic() {
printCurrentType();
}
static printCurrentType() {
print(User);
}
}
如果您想printCurrentType()
成为一些通用方法,可以打印出调用它的任何静态方法的包含类的类型,那么……这是一项艰巨的任务。最简单的答案是不要尝试这样做并将类作为参数传递:
class User {
static onmystatic() {
printCurrentType(User);
}
}
printCurrentType(Type type) {
print(type);
}
复杂的答案是你可以抛出一个异常,解析堆栈跟踪,并尝试通过一些规则来确定你应该打印哪个类。我会把它作为练习留给读者:)
事实上,如果不参考类本身,目前是不可能做到这一点的。
但总是存在一种不优雅的方式。这是您直接问题的答案(不是间接方式)。如果你想使用这个:
printCurrentType();
但你不想使用这个:
printCurrentType(User);
然后看看这个例子:
import 'package:stack_trace/stack_trace.dart';
void main() {
User.onmystatic();
printCurrentType(); // should print: null
}
class User {
static onmystatic() {
printCurrentType(); // should print: User
Teacher.onmystatic(); // should print: Teacher
}
}
class Teacher {
static onmystatic() {
onmystatic2();
}
static onmystatic2() {
printCurrentType();
}
}
void printCurrentType() {
print(getClass(2));
}
String getClass(int position) {
var trace = new Trace.current();
var frames = trace.frames;
if(position >= frames.length) {
return null;
}
var member = frames[position].member;
var parts = member.split('.');
if(parts.length < 2) {
return null;
}
return parts[0];
}
它产生输出:
User
Teacher
null
而且没有魔法……