(dart:mirrors)反射函数类型的变量时,无法调用

(dart:mirrors)反射函数类型的变量时,无法调用,dart,Dart,当函数本身实际上是一个变量时,有没有方法调用函数?我尝试了以下方法: 导入“省道:镜像”; void main(){ TestClass test=新的TestClass(); 反射(测试).invoke(常量符号(“init”),[]); } 类TestClass{ 函数init=()=>print(“hi”); } 最终得到了这个错误: Breaking on exception: Class 'TestClass' has no instance method 'init'. Exce

当函数本身实际上是一个变量时,有没有方法调用函数?我尝试了以下方法:

导入“省道:镜像”;
void main(){
TestClass test=新的TestClass();
反射(测试).invoke(常量符号(“init”),[]);
}
类TestClass{
函数init=()=>print(“hi”);
}
最终得到了这个错误:

Breaking on exception: Class 'TestClass' has no instance method 'init'.

Exception: Class 'TestClass' has no instance method 'init'.

NoSuchMethodError : method not found: 'init'
Receiver: Instance of 'TestClass'
Arguments: []
  main (http://127.0.0.1:3030/test/web/test.dart:6:23)

我看到在反映这个类时,“init”变量确实出现在声明中,但是它被视为变量而不是函数。只是想知道是否有办法解决这个问题?

在本例中,init是一个引用函数的字段/属性

拆下=即可工作

导入“省道:镜像”;
void main(){
TestClass test=新的TestClass();
var r=reflect(test).invoke(#init,[]);
}
类TestClass{
void init()=>打印(“hi”);
}
通过您的示例,您可以像下面这样调用闭包

导入“省道:镜像”;
void main(){
TestClass test=新的TestClass();
ClosureMirr=反射(test.init);
r、 应用([]);
}
类TestClass{
函数init=()=>print(“hi”);
}
检查字段或方法是否正确的扩展示例

导入“省道:镜像”;
void main(){
TestClass test=新的TestClass();
var m=reflectClass(TestClass).declarations[#init];
if(m是可变镜像){
(将(test.init)反射为ClosureMrror)。应用([]);
}else if(m是MethodMirror){
反射(测试)。调用(#init,[]);
}
var m2=reflectClass(TestClass).declarations[#init2];
if(m是可变镜像){
(将(test.init2)反射为ClosureMarker)。应用([]);
}else if(m是MethodMirror){
反射(测试)。调用(#init2,[]);
}
}
类TestClass{
函数init=()=>print(“hi”);
void init2()=>打印(“hi”);
}

我想我刚才回答了我自己的问题:

导入“省道:镜像”;
void main(){
TestClass test=新的TestClass();
试一试{
反射(测试).invoke(常量符号(“init”),[]);
}捕获(e){
(反射(测试).getField(常量符号(“init”))作为closuremirr.apply([]);
}
}
类TestClass{
函数init=()=>print(“hi”);
}

这应该可以做到,对于任何想知道:-)

的人来说,我理解这一点(我想),但我仍然不确定如何调用函数引用。。。编辑:我想出来了,在我的主要问题下发了一个帖子,刚刚看到了你的评论。我觉得我的例子稍微优雅一点;-)好的,这是如果你不知道它是一个方法还是一个引用方法的字段。对,我可能应该更具体一些。这还允许您用任何函数/方法名替换“init”。现在我明白你想要什么了,我觉得你的问题很好;-)请注意,您可以使用function.apply(test.init)调用函数,而无需通过镜像。但是,在本例中,您仍然需要镜像来获取由字符串命名的成员,该字符串仅在运行时已知。