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

What is the format of the "arguments" parameter to ClassMirror.newInstance()?

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

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

文档中有一篇关于 positionalArguments 和 namedArguments 格式的精彩文章。然而,这只是在我目前的容忍水平上的抽象方面。

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

在我的例子中,我想简单地将两个参数 "title" 和 "description" 传递给一个未命名的 subclass 构造函数。

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

文件: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);
}

这是实例化的 class:

文件: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 是其自身层次结构的 superclass,由 CodelabElement:

子class

文件:item_element.dart:

import 'item.dart' show Item;

class ItemElement {
    Item item;
    final String itemType;

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

和 CodelabElement:

文件:codelab_element.dart

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

class CodelabElement extends ItemElement {

    final itemType = "Codelab";

    CodelabElement() : super() {}

    //...
}

然后:

文件:main.dart

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

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

可能是我不清楚"extends"和"implements"的用法有关。

这应该有效

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

很像

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

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

您可以在DartPad

中尝试