飛鏢代碼:是否可以在靜態方法中獲取類類型?
class User() {
static onmystatic() {
printCurrentType(); // should print: User
}
}
注意的printCurrentType()
在類User
,是有可能實現嗎?我試過this.runtimeType
但它提醒我this
不在範圍內。
飛鏢代碼:是否可以在靜態方法中獲取類類型?
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
而且也沒有魔法......
你一定是個好老師:) – Freewind