在dart中,可以从字符串示例化一个类吗?举例来说:
var myObject = window[classNameString];
id myclass = [[NSClassFromString(@"MyClass") alloc] init];
bwleehnv1#
试试看:
Map models = {"Player": Player.instantiate}; var player = models["Player"](); class Player{ static instantiate() => Player(); }
m1m5dgzv2#
您需要知道库名称和类名才能使事情正常工作。假设你知道这两个,下面的例子将示例化TestClass并调用doStuff。
TestClass
doStuff
library test; import "dart:mirrors"; class TestClass { doStuff() => print("doStuff was called!"); } main() { MirrorSystem mirrors = currentMirrorSystem(); LibraryMirror lm = mirrors.libraries['test']; ClassMirror cm = lm.classes['TestClass']; Future tcFuture = cm.newInstance('', []); tcFuture.then((InstanceMirror im) { var tc = im.reflectee; tc.doStuff(); }); }
关于此解决方案的一些注意事项:1.我们试图加载类的库test已经导入到VM中,这使得这种情况更容易一些。1.调用newInstance允许向构造函数传递参数。实现了位置参数,但尚未实现命名参数(从M2版本开始)。
test
newInstance
pobjuy323#
语法已更改。我让它这样工作
library test; import "dart:mirrors"; class TestClass { doStuff() => print("doStuff was called!"); } main() { MirrorSystem mirrors = currentMirrorSystem(); LibraryMirror lm = mirrors.libraries.values.firstWhere( (LibraryMirror lm) => lm.qualifiedName == new Symbol('test')); ClassMirror cm = lm.declarations[new Symbol('TestClass')]; InstanceMirror im = cm.newInstance(new Symbol(''), []); var tc = im.reflectee; tc.doStuff(); }
如果有更多的库名为'test',这将失败。
yeotifhr4#
这是一个困扰我的问题,直到我发现我可以实现一个粗糙的from方法来处理 * 编码的Json对象/字符串 * 或 Dart Maps 到所需类的转换。下面是一个简单的例子,它也处理空值并接受JSON(* 作为 * 字符串 * 参数 *)
import 'dart:convert'; class PaymentDetail { String AccountNumber; double Amount; int ChargeTypeID; String CustomerNames; PaymentDetail({ this.AccountNumber, this.Amount, this.ChargeTypeID, this.CustomerNames }); PaymentDetail from ({ string : String, object : Map }) { var map = (object==null) ? (string==null) ? Map() : json.decode(string) : (object==null) ? Map() : object; return new PaymentDetail( AccountNumber : map["AccountNumber"] as String, Amount : map["Amount"] as double, ChargeTypeID : map["ChargeTypeID"] as int, CustomerNames : map["CustomerNames"] as String ); } }
下面是它的实现
PaymentDetail payDetail = new PaymentDetail().from(object: new Map()); PaymentDetail otherPayDetail = new PaymentDetail().from(object: {"AccountNumber": "1234", "Amount": 567.2980908});
再一次,在整个项目中进行克隆是过于简单和繁琐的,但它适用于简单的情况。
4条答案
按热度按时间bwleehnv1#
试试看:
m1m5dgzv2#
您需要知道库名称和类名才能使事情正常工作。假设你知道这两个,下面的例子将示例化
TestClass
并调用doStuff
。关于此解决方案的一些注意事项:
1.我们试图加载类的库
test
已经导入到VM中,这使得这种情况更容易一些。1.调用
newInstance
允许向构造函数传递参数。实现了位置参数,但尚未实现命名参数(从M2版本开始)。newInstance
返回一个Future以允许它跨isolates工作。pobjuy323#
语法已更改。我让它这样工作
如果有更多的库名为'test',这将失败。
yeotifhr4#
这是一个困扰我的问题,直到我发现我可以实现一个粗糙的from方法来处理 * 编码的Json对象/字符串 * 或 Dart Maps 到所需类的转换。
下面是一个简单的例子,它也处理空值并接受JSON(* 作为 * 字符串 * 参数 *)
下面是它的实现
再一次,在整个项目中进行克隆是过于简单和繁琐的,但它适用于简单的情况。