ClassMirror.newInstance()的“arguments”参数的格式是什么?

时间:2015-11-05 09:46:33

标签: dart factory dart-mirrors

我非常愿意玩这个,直到我做对了,但希望有人可能会给我一个暗示。该参数在docs(gen-dartdocs / dart-mirrors / ClassMirror / newInstance.html)中声明为

InstanceMirror newInstance(Symbol constructorName,
                      List positionalArguments,
                      [Map<Symbol,dynamic> namedArguments]);

docs中的positionalArguments和namedArguments格式有一个很好的写法。但是,这只是我当前容忍度的抽象方面。

还有一个体面的讨论 http://japhr.blogspot.com/2014/06/dart-factory-method-pattern.html 但是,唉,没有实际将args传递给方法的例子。

就我而言,我想简单地将两个args,“title”和“description”传递给一个未命名的子类构造函数。

到目前为止,这是我的代码:

file:item.dart

import 'dart:mirrors';

abstract class Item {

    String title;
    String description;

    factory Item(String type) {
      MirrorSystem libs = currentMirrorSystem();
      LibraryMirror lib = libs.findLibrary(new Symbol('app.models'));
      Map<Symbol, Mirror> classes = lib.declarations;
      // To do: handle exception if class not found
      ClassMirror cls = classes[new Symbol(type)];
      // TODO:
      //  verify each subclass has no-arg ctor
      //  determ how to pass args to ctor.
      InstanceMirror inst = cls.newInstance(new Symbol(''), []);
      return inst.reflectee;
    }

    // conflicts w/ Item factory
//  Item(this.title, this.description);
}

这是实例化的类:

file:model.dart

library app.models;

import 'item.dart' show Item;

/// The barebones model for a codelab. Defines constants used for validation.
class Codelab implements Item {
   // ...
}

最后,这是如何调用Item工厂的。 ItemElement是其自己的层次结构的超类,由CodelabElement子类化:

file:item_element.dart:

import 'item.dart' show Item;

class ItemElement {
    Item item;
    final String itemType;

    ItemElement() {
      item = new Item(itemType);
    }
    // ...
}

CodelabElement:

file:codelab_element.dart

import 'model.dart' show Codelab;
import 'item_element.dart' show ItemElement;

class CodelabElement extends ItemElement {

    final itemType = "Codelab";

    CodelabElement() : super() {}

    //...
}

然后:

file:main.dart

void main() {
    var element = new CodelabElement();
}

目前,新的Codelab实例是从newInstance()返回的(非常酷),但它不包含继承的'title'和'description'attrs。

也许这与我对“扩展”和“工具”的使用不清楚有关。

1 个答案:

答案 0 :(得分:1)

这应该有效

cls.newInstance(new Symbol(''), ['a', 1] /*, 
    {#arg1Name: 'arg1Value', #arg2Name: 'arg2Value'}*/ );

就像

new MyClass('a', 1, arg1Name: 'arg1Value' /*, arg2Name: 'arg2Value'*/); 

刚看到,名字参数没有实现。

您可以在DartPad

中试用