0

所以,我查看了镜子,它们可能是一个选择,但考虑到它们的异步特性,它们可能真的很难使用,或者从长远来看是不可行的。由于它们目前不受支持(只是一个玩物),因此无论如何它们目前都不是真正可行的。

问题:给定一系列字符串,例如。[ "Foo", "Bar" ]基类ApplicationWidgetinlibrary corelib;以及每个字符串的对应类FooWidgetin BarWidget,这是目前将字符串转换为对应类的实例的library applibrary;最优雅的方法,适用于 dart2jsApplication

为了清楚起见,等效的 PHP 伪示例,

<?php # example

namespace corelib;

class Widget {
    function name() { 
        return \get_called_class(); 
    }
}

class Application {
    static function resolve($name, $library) { 
        $class = $library.'\\'.$name.'Widget'; 
        return new $class;
    }
}

namespace applibrary;

class FooWidget extends \corelib\Widget {
    // ...
}

class BarWidget extends \corelib\Widget {
    // ...
}

$foowidget = \corelib\Application::resolve('Foo', 'applibrary');
$barwidget = \corelib\Application::resolve('Bar', 'applibrary');

echo "{$foowidget->name()} <br> {$barwidget->name()}";

输出

applibrary\FooWidget 
applibrary\BarWidget
4

1 回答 1

1

如果您可以验证字符串列表,那么目前最好的方法(直到 dart2js 中的镜像支持变得更好)可能是一个if声明。

// toy implementation
Widget getWidget(name) {
  switch (name) {
     case "Foo": return new FooWidget();
     case "Bar": return new FooWidget();
     default: // handle error
  } 
} 

// elsewhere:
var fooWidget = getWidget("Foo");
var barWidget = getWidget("Bar");

类列表xyzWidget将是一个有限列表(因为无论如何您都无法在运行时动态链接代码)。

当然,更优雅的实现是使用镜像(如下所示,供参考,虽然它目前不满足 dar2js 标准)

Future<Widget> getWidget(library, name) {
  var completer = new Completer<Widget>();
  MirrorSystem ms = currentMirrorSystem();
  ClassMirror cm = ms.libraries[library].classes[name];
  // instantiate an instance of the class
  cm.newInstance(null,[]).then((instance) => completer.complete(instance));

  return completer.future;
}

// elsewhere:   
getWidget("applibrary","FooWidget").then((Widget widget) {
  // do something with widget
});
于 2013-02-05T10:25:24.427 回答