2

飞镖代码:

class User() {
   static onmystatic() {
       printCurrentType(); // should print:  User
   }
}

注意printCurrentType()类中的User,是否可以实现它?我试过this.runtimeType了,但它提醒我this不在范围内。

4

2 回答 2

3

由于onmystatic()是静态的,它调用的任何函数都必须是静态的(或某个对象的实例方法),所以我假设printCurrentType()也是静态的。由于静态方法不能被覆盖,类型是常量,你可以写:

class User {
  static onmystatic() {
    printCurrentType();
  }

  static printCurrentType() {
    print(User);
  }
}

如果您想printCurrentType()成为一些通用方法,可以打印出调用它的任何静态方法的包含类的类型,那么……这是一项艰巨的任务。最简单的答案是不要尝试这样做并将类作为参数传递:

class User {
  static onmystatic() {
    printCurrentType(User);
  }
}

printCurrentType(Type type) {
  print(type);
}

复杂的答案是你可以抛出一个异常,解析堆栈跟踪,并尝试通过一些规则来确定你应该打印哪个类。我会把它作为练习留给读者:)

于 2013-07-27T05:26:20.983 回答
2

事实上,如果不参考类本身,目前是不可能做到这一点的。

但总是存在一种不优雅的方式。这是您直接问题的答案(不是间接方式)。如果你想使用这个:

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

而且没有魔法……

于 2013-07-27T10:44:52.977 回答