1

ダーツコード:

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

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

関数名を文字列として使用すると、実際の関数"hello"のパラメーターを取得できますか?String namehello

4

2 に答える 2

4

ミラーを使用してそれを行うことができます。

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");
  }
}
于 2013-07-09T17:34:25.333 に答える
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);
}
于 2013-07-09T17:39:49.963 に答える