是否可以在静态方法中获取类类型?

时间:2013-07-27 04:06:56

标签: types dart

飞镖码:

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

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

2 个答案:

答案 0 :(得分:3)

由于onmystatic()是静态的,它调用的任何函数都必须是静态的(或某个对象的实例方法),所以我假设printCurrentType()也是静态的。由于无法覆盖静态方法,因此类型是常量,您只需编写:

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

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

如果你想让printCurrentType()成为一个通用的方法来打印它所调用的任何静态方法的包含类的类型,那么......这是一个非常艰巨的任务。最简单的答案就是不要尝试这样做并将类作为参数传递:

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

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

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

答案 1 :(得分: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

没有魔法......