Dart 当给定字符串作为方法名时动态调用类方法

Dart 当给定字符串作为方法名时动态调用类方法,dart,Dart,考虑JavaScript中的以下代码: 类的东西{ foo(){console.log('foo')} bar(){console.log('bar')} } const thing=新事物(); for(设i=0;i

考虑JavaScript中的以下代码:

类的东西{
foo(){console.log('foo')}
bar(){console.log('bar')}
}
const thing=新事物();
for(设i=0;i<5;i++){
const methodName=i%2!==0
“福”
:“酒吧”;
thing[methodName]();//这里的这部分是重要的部分
}
这样的事情在Dart中可能发生吗?我希望动态调用一个方法。在Dart中,什么是被认可的方式?if/else链或开关是唯一的方法吗

void main(){
TestThing test=TestThing();
对于(int i=0;i<5;i++){
最终方法=i.isOdd
“福”
:“酒吧”;
test[method]();//错误:没有为TestThing类定义运算符“[]”
}
}
类测试{
TestThing();
int foo(){
印刷品(‘foo’);
返回1;
}
整型条(){
打印(‘条形’);
返回2;
}
}

是的,这可以通过。 以下是您的示例将如何实现它:

导入“dart:mirrors”;
类测试对象{
int foo(){
印刷品(‘foo’);
返回1;
}
整型条(){
打印(‘条形’);
返回2;
}
}
void main(){
TestThing test=TestThing();
InstanceMirror mirror=反射(测试);
对于(int i=0;i<5;i++){
最终方法=i.isOdd
“福”
:“酒吧”;
invoke(方法,[]);
}
}

您实际上不需要为此使用
dart:mirror
。您可以在类上实现
noSuchMethod
,并在这里定义应该发生什么。您需要将变量标记为
dynamic
,以告知编译器您的类型错误是故意的:

void main() {
  final dynamic test = TestThing();
  for (int i = 0; i < 5; i++) {
    final method = i.isOdd ? 'foo' : 'bar';
    test[method]();
  }
}

class TestThing {
  TestThing();

  int foo() {
    print('foo');
    return 1;
  }

  int bar() {
    print('bar');
    return 2;
  }

  @override
  dynamic noSuchMethod(Invocation invocation) {
    return () =>
        print('You tried to fetch: ${invocation.positionalArguments.first}');
  }
}