Dart 如何将类型传递给函数并调用其静态方法?
假设T1、T2和T3都有静态函数f1、f2、f3,我想一般调用这些函数 这样的事情怎么容易做到呢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
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个函数引用并按照需要的方式进行组合。