2014-11-23 1 views
0

Я хочу написал метод, который называют все функции в классе:дротик вызова отражения струнных

class Example extends MyAbstractClass { 
    void f1(){...} 
    void f2(){...} 
    void f3(){...} 
    Example(){ 
    callAll();//this call f1(), f2() and f3(). 
    } 
} 

У меня есть проблемы в этой части коды:

reflectClass(this.runtimeType).declarations.forEach((Symbol s, DeclarationMirror d) { 
    if (d.toString().startsWith("MethodMirror on ")) { 
    String methodName = d.toString().substring(16).replaceAll("'", ""); 
    print(methodName); 
    // How to call function by name methodName? 
    } 
}); 

ответ

1

вместо

if (d.toString().startsWith("MethodMirror on ")) { 

Вы можете использовать

if (d is MethodMirror) { 

Вам нужен InstanceMirror экземпляра класса. Я думаю, в вашем случае это будет

var im = reflect(this).invoke(d.simpleName, []); 
im.declarations.forEach((d) ... 

смотри также How can I use Reflection (Mirrors) to access the method names in a Dart Class?

+0

ТНХ, он выглядит лучше с вашим, если. МетодMirror dosen't имеет метод invoke. –

+1

Вам просто нужно «отразить (это)' перед итерацией. – Robert

0

Использование dson вы можете сделать:

library example_lib; 

import 'package:dson/dson.dart'; 

part 'main.g.dart'; 

@serializable 
class Example extends _$ExampleSerializable { 
    Example() { 
    _callAll(); 
    } 
    fn1() => print('fn1'); 
    fn2() => print('fn2'); 
    fn3() => print('fn3'); 
    fn4() => print('fn4'); 

    _callAll() { 
    reflect(this).methods.forEach((name, method) { 
     if(name != '_callAll') this[name](); 
    }); 
    } 
} 

main(List<String> arguments) { 
    _initMirrors(); 

    new Example(); 
}