ダーツコード:
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
そして、魔法はありません...