Reflection 如何获取函数引用的名称?

Reflection 如何获取函数引用的名称?,reflection,dart,Reflection,Dart,考虑以下几点 省道码 输出 关闭“MyClass”实例的“barMethod$0” () 问题: 假设SomeClass是不可变的,我如何让它只打印barMethod或footmethod?(也可以接受SomeClass.barMethod或SomeClass.fooMethod)您可以使用反射来完成此操作,但如果您打算使用dart2js在浏览器中运行此操作,成本可能会很高。此代码段适用于: import'dart:math'随机显示; 导入“dart:镜像”; void main(){ MyC

考虑以下几点

省道码 输出
关闭“MyClass”实例的“barMethod$0”

()

问题:
假设
SomeClass
是不可变的,我如何让它只打印
barMethod
footmethod
?(也可以接受
SomeClass.barMethod
SomeClass.fooMethod

您可以使用反射来完成此操作,但如果您打算使用dart2js在浏览器中运行此操作,成本可能会很高。此代码段适用于:

import'dart:math'随机显示;
导入“dart:镜像”;
void main(){
MyClass MyClass=新的MyClass();
//而不是(x%2==0)您可以执行x.isEven,
//但也有Random.nextBool()
函数指针=new Random().nextBool()?myClass.foo:myClass.bar;
ClosureMarror cm=反射(指针)为ClosureMarror;
打印(MirrorSystem.getName(cm.function.simpleName));
指针();
}
类MyClass{
void foo(){}
无效条(){}
}

您可以使用反射来实现这一点,但如果您打算在浏览器中使用dart2js运行反射,那么这可能会很昂贵。此代码段适用于:

import'dart:math'随机显示;
导入“dart:镜像”;
void main(){
MyClass MyClass=新的MyClass();
//而不是(x%2==0)您可以执行x.isEven,
//但也有Random.nextBool()
函数指针=new Random().nextBool()?myClass.foo:myClass.bar;
ClosureMarror cm=反射(指针)为ClosureMarror;
打印(MirrorSystem.getName(cm.function.simpleName));
指针();
}
类MyClass{
void foo(){}
无效条(){}
}

感谢您指出
.isEven
.nextBool()的存在
!这是一个很好的开始,谢谢!如果
foo
bar
被声明为静态,那么它就有点崩溃了,不过。。。我意识到这不在最初的问题中,但是有没有处理静态和非静态的解决方案?这些方法名是否静态已知(编译时)?你可以制作一个不理想的
映射
,但反射并不理想。它们被编译器静态地称为
静态的
,否则就不可能了。我不想手动维护映射中硬编码的方法列表。它需要以某种方式自动运行。感谢您指出
.isEven
.nextBool()
的存在!这是一个很好的开始,谢谢!如果
foo
bar
被声明为静态,那么它就有点崩溃了,不过。。。我意识到这不在最初的问题中,但是有没有处理静态和非静态的解决方案?这些方法名是否静态已知(编译时)?你可以制作一个不理想的
映射
,但反射并不理想。它们被编译器静态地称为
静态的
,否则就不可能了。我不想手动维护映射中硬编码的方法列表。它需要在某种程度上是自动的。我想知道用例是什么。解决方案(如果存在的话)只能在独立的VM中工作(在web上不太好,也不能在所有的Flitter中工作)。@matanlurey我的特定用例是只用于后端服务器代码的,所以独立VM很好。我想知道这个用例是什么。解决方案(如果存在的话)只能在独立的VM中工作(在web上不是很好,在Flatter中也不是很好)。@matanlurey我的特定用例是只针对后端服务器代码的,所以独立VM是可以的
import 'dart:math';

void main() {
  SomeClass someClass = new SomeClass();
  Function  pointer   = ((new Random().nextInt(100) % 2) == 0 ? someClass.fooMethod : someClass.barMethod);

  print('$pointer');
}