Dart 通过名称为 class 的字符串创建 class 实例
Dart create class instance by string with class name
我想通过字符串中的名称调用 class 的函数。我知道我最好的选择是镜子。
var ref = reflect(new TestClass());
ref.invoke(Symbol("test"), []);
很好用,我可以通过字符串调用函数测试。但我也想把“TestClass”放在一个字符串中。有可能吗?
var ref = reflect("TestClass");
ref.invoke(Symbol("test"), []);
乔纳斯
你可以这样做:
import 'dart:mirrors';
class MyClass {
static void myMethod() {
print('Hello World');
}
}
void main() {
callStaticMethodOnClass('MyClass', 'myMethod'); // Hello World
}
void callStaticMethodOnClass(String className, String methodName) {
final classSymbol = Symbol(className);
final methodSymbol = Symbol(methodName);
(currentMirrorSystem().isolate.rootLibrary.declarations[classSymbol]
as ClassMirror)
.invoke(methodSymbol, <dynamic>[]);
}
请注意,此实现确实要求 myMethod
是静态的,因为我们从不创建任何对象,而只是直接对 class 本身进行操作。您可以通过在 ClassMirror
上调用 newInstance
从 class 创建新对象,但您随后需要调用构造函数。
但我希望这就足够了。如果没有,请询问,我可以尝试添加更多示例。
我想通过字符串中的名称调用 class 的函数。我知道我最好的选择是镜子。
var ref = reflect(new TestClass());
ref.invoke(Symbol("test"), []);
很好用,我可以通过字符串调用函数测试。但我也想把“TestClass”放在一个字符串中。有可能吗?
var ref = reflect("TestClass");
ref.invoke(Symbol("test"), []);
乔纳斯
你可以这样做:
import 'dart:mirrors';
class MyClass {
static void myMethod() {
print('Hello World');
}
}
void main() {
callStaticMethodOnClass('MyClass', 'myMethod'); // Hello World
}
void callStaticMethodOnClass(String className, String methodName) {
final classSymbol = Symbol(className);
final methodSymbol = Symbol(methodName);
(currentMirrorSystem().isolate.rootLibrary.declarations[classSymbol]
as ClassMirror)
.invoke(methodSymbol, <dynamic>[]);
}
请注意,此实现确实要求 myMethod
是静态的,因为我们从不创建任何对象,而只是直接对 class 本身进行操作。您可以通过在 ClassMirror
上调用 newInstance
从 class 创建新对象,但您随后需要调用构造函数。
但我希望这就足够了。如果没有,请询问,我可以尝试添加更多示例。