0

我有一个函数,它接受另一个函数及其参数作为参数。函数的返回类型及其参数类型是未知的。我需要在运行时知道参数函数是否返回一个值或者它是否是一个 void 函数。

functionHandler(Function fn, List<dynamic> args) {
  var result = fn(args[0], args[1]);
  if ( -- fn returns a value --)
    doSomething();
  else if ( -- fn is a void function --)
    doSomethingElse();
}

我不能使用 fn.runtimeType 因为参数类型是未知的。

void 函数将返回 null,但我无法区分 void 函数和仅返回 null 值的函数。

如果 fn 是返回类型为 void 的函数,有什么方法可以在运行时检查?

4

1 回答 1

0

一种骇人听闻的方法是使用fn.runtimeType.toString().endsWith('=> void').

由于您似乎知道它fn恰好需要两个位置参数,因此更好的方法是创建functionHandler一个泛型函数,Function使用参数化类型完全限定您的类型,然后检查返回类型的类型参数:

dynamic functionHandler<ReturnType, ArgumentType1, ArgumentType2>(
  ReturnType Function(ArgumentType1, ArgumentType2) fn,
  List<dynamic> args,
) {
  // `ReturnType == void` is a syntax error, so we must do a little
  // dance to get its corresponding `Type` object.
  Type getType<T>() => T;

  if (ReturnType == getType<void>()) {
    print('void');
  } else {
    print('non-void');
  }
}

void main() {
  // Test a `void` function.
  void voidFunction(Object arg1, dynamic arg2) {}
  functionHandler(voidFunction, []); // Prints: void

  // Test a function that returns `null`.
  Null nullFunction(int arg1, String? arg2) => null;
  functionHandler(nullFunction, []); // Prints: non-void

  // Test a function with optional arguments.
  int intFunction(int arg1, [int? arg2, int? arg3]) => 0;
  functionHandler(intFunction, []); // Prints: non-void
}
于 2021-07-24T17:45:13.890 回答