2013-07-09 1 views
0

Dart код:Если я знаю имя функции, можно ли получить ее параметры?

void hello(String name) { 
    print(name); 
} 

main() { 
    var funcName = "hello"; 
    // how to get the parameter `String name`? 
} 

Используя имя функции в виде строки, "hello", можно получить параметр String name реальной функции hello?

+0

При прохождении что-то это называет 'parameter'. Например. 'FUNC (param1)'. Когда вы получаете эти 'параметры' в' function body', это называется уже не 'parameter', а' argument'. 'Where',' how' и 'what' (' parameters' или 'arguments') вы хотите получить? – mezoni

+0

Я хочу 'parameter' :) – Freewind

ответ

3

Для этого вы можете использовать mirrors.

import 'dart:mirrors'; 

void hello(String name) { 
    print(name); 
} 

main() { 
    var funcName = "hello"; 

    // get the top level functions in the current library 
    Map<Symbol, MethodMirror> functions = 
     currentMirrorSystem().isolate.rootLibrary.functions; 
    MethodMirror func = functions[const Symbol(funcName)]; 

    // once function is found : get parameters 
    List<ParameterMirror> params = func.parameters; 
    for (ParameterMirror param in params) { 
    String type = MirrorSystem.getName(param.type.simpleName); 
    String name = MirrorSystem.getName(param.simpleName); 
    //.... 
    print("$type $name"); 
    } 
} 
+0

Я получил' String '? – Freewind

+0

Я тоже. См. [Выпуск 11684] (http://dartbug.com/11684). –

2

Вы получаете эту информацию через отражение (что она еще не полностью завершена):

library hello_library; 

import 'dart:mirrors'; 

void main() { 
    var mirrors = currentMirrorSystem(); 
    const libraryName = 'hello_library'; 
    var libraries = mirrors.findLibrary(const Symbol(libraryName)); 
    var length = libraries.length; 
    if(length == 0) { 
    print('Library not found'); 
    } else if(length > 1) { 
    print('Found more than one library'); 
    } else { 
    var method = getStaticMethodInfo(libraries.first, const Symbol('hello')); 
    var parameters = getMethodParameters(method); 
    if(parameters != null) { 
     for(ParameterMirror parameter in parameters) { 
     print('name: ${parameter.simpleName}:, type: ${parameter.type.simpleName}'); 
     } 
    } 
    } 
} 

MethodMirror getStaticMethodInfo(LibraryMirror library, Symbol methodName) { 
    if(library == null) { 
    return null; 
    } 

    return library.functions[methodName]; 
} 

List<ParameterMirror> getMethodParameters(MethodMirror method) { 
    if(method == null) { 
    return null; 
    } 

    return method.parameters; 
} 

void hello(String name) { 
    print(name); 
}