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
中尝试
我非常愿意玩这个直到我做对为止,但希望有人能给我一个提示。该参数在文档 (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
中尝试