Dart 如何将类型传递给函数并调用其静态方法?

Dart 如何将类型传递给函数并调用其静态方法?,dart,Dart,假设T1、T2和T3都有静态函数f1、f2、f3,我想一般调用这些函数 这样的事情怎么容易做到呢 class T1 { static f1(i) => i+1; static f2(i) => i+1; static f3(i) => i+1; } class T2 { static f1(i) => i+2; static f2(i) => i+2; static f3(i) => i+2; } class T3 { stat

假设T1、T2和T3都有静态函数f1、f2、f3,我想一般调用这些函数

这样的事情怎么容易做到呢

class T1 {
  static f1(i) => i+1;
  static f2(i) => i+1;
  static f3(i) => i+1;
}

class T2 {
  static f1(i) => i+2;
  static f2(i) => i+2;
  static f3(i) => i+2;
}

class T3 {
  static f1(i) => i+3;
  static f2(i) => i+3;
  static f3(i) => i+3;
}

callGenerically(dynamic type) {
  print(type);

  type.f1(type.f2(type.f3));
}

main() {
  callGenerically(T1);
  callGenerically(T2);
  callGenerically(T3);
}

这会打印T1,所以它会得到类型。只是不知道如何调用它的静态函数。即使f1、f2、f3预计存在,镜像是否是一个选项或要求?

我想,要想在没有dart的情况下工作,镜像需要着陆


中的代码应该可以让您开始使用-不确定它是否仍然可以正常工作,我已经花了很长时间发布了答案:D

此构造选择静态函数。也许还有其他人

typedef int fadd_t(final int i);

abstract class T {
  final fadd_t f1;
  final fadd_t f2;
  final fadd_t f3;

  T(final this.f1, final this.f2, final this.f3);

  int fsum(final int i){
     return f1(f2(f3(i)));
  }
}

class T1 extends T {

  T1() : super(lf1, lf2, lf3){
  }

  static lf1(i) => i+1;
  static lf2(i) => i+1;
  static lf3(i) => i+1;
}

class T2 extends T {

  T2() : super(lf1, lf2, lf3){
  }

  static lf1(i) => i+2;
  static lf2(i) => i+2;
  static lf3(i) => i+2;
}

callGenerically(final T t, final int i) {
  return t.f1(t.f2(t.f3(i)));
}


main() {

    T1 t1 = new T1();
    print('T1 fsum(1) : ' + t1.fsum(1).toString() );
    print('T1 callGenerically(1) : ' + callGenerically(t1, 1).toString() );

    T2 t2 = new T2();
    print('T2 fsum(1) : ' + t2.fsum(1).toString() );
    print('T2 callGenerically(1) : ' + callGenerically(t2, 1).toString() );
}
T1 fsum1:4

T1呼叫一般1:4

T2 fsum1:7

T2调用常规1:7要使用省道:镜像执行此操作,请执行以下操作:

reflectTypeSomeClass.invokesomeStaticMethod,[].reflectee; 现在,如果将其包装在一个helper方法调用中,则callgenerally可以如下所示:

callGenericallyType类型,num arg=> calltype,f1,[calltype,f2,[calltype,f3,[arg]]; 您可以在中看到完整的示例

注意

这是一种反模式,最好与Dart的类型系统通信,了解预期存在的方法。如果您知道这些类具有相同的API,只需使用普通多态性而不是反射,就像Jonas的回答一样。 使用dart:mirrors可以防止dart2js中的树抖动,从而产生膨胀的JS。 对f3的调用需要一个参数,因此CallGeneraly中的第二个参数。
这是很有帮助的,但我不想构造一个实例,否则就不需要它,只需要让镜像调用一个静态函数。此外,可能无法保证T有一个默认的ctor。我没有看到元类讨论,这看起来像是我要找的。我很久没有使用dart:mirrors了,也不记得细节。在dart:mirrors中,您将需要reflectTypeT1.invokef1,[],就像在中一样,我只想说,一般来说,这不是一个好的模式。如果你不是被迫这么做的,或者这不仅仅是一个语言实验,那么试着选择一种不同的方法,不使用dart:mirrors。为什么在你的场景中使用3个typedef不起作用?您可以传递3个函数引用并按照需要的方式进行组合。