我对原始问题的敬意。我很困惑。这是我的实际问题。
我遇到一种情况,我需要使用一些定义的类作为Type
类型的对象并将其实例化为对象实例。到目前为止,我正在使用自定义的静态实例化函数来调用构造函数,它的工作原理很好。因此,我只需调用Function.apply()
即可创建一个对象。除了这样做,我还可以使用任何方法使用类的Type
来模拟类的构造函数。
我尝试了什么?他们说使用Mirror
,这是Dart反思的解决方案。
import 'dart:mirrors'
失败,错误
URI目标不存在
或者至少在没有准备好的情况下,如果我不知道从何处获得包裹。
import 'package:reflectable/mirrors.dart'
和 git://github.com/dart-lang/reflectable.git 中的软件包仅定义了所有Mirror
实现的类,但函数{{1} }丢失。
答案 0 :(得分:2)
如果不添加括号()
,则可以删除函数。您不需要dart:mirror
。
void main() {
// Tear off a global function
Function myFunction = MyClass.someStaticFunction;
// Call it statically
myFunction('arg');
// Call it dynamically
Function.apply(myFunction, ['arg']);
// Tear it off with a precise Function Type
void Function(String) myFunction2 = MyClass.someStaticFunction;
}
class MyClass {
static void someStaticFunction(String someArg) {
print('someStaticFunction $someArg');
}
}
答案 1 :(得分:2)
您不能从代表类的Type
对象创建类的实例,至少不能没有镜像(Flutter和Web平台均不支持镜像)。
您无法删除构造函数(但是,我希望我们会在某个时候添加该功能),因此最好选择创建一个静态的辅助函数来调用该构造函数,并传递该辅助函数,这是最好的选择当前的解决方案。
如果您知道此类函数所需的参数数量,则无需使用Function.apply
,只需直接调用它即可。
答案 2 :(得分:1)
如果你不想用户反射,你可以这样做。
class A {
}
class B {
}
dynamic init(Type cls){
switch (cls) {
case A:
return A();
case B:
return B();
}
}
void main() {
print(init(A));
print(init(B));
}
作为最佳实践,为了保持条理并避免使用动态,您可以从公共基础扩展并调用静态构造函数。
class A extends Base{
}
class B extends Base{
}
abstract class Base{
static Base init(Type cls){
switch (cls){
case A:
return A();
case B:
return B();
}}
}
void main() {
print(Base.init(A));
print(Base.init(B));
}
输出:
Instance of 'A'
Instance of 'B'
Process finished with exit code 0