dart 从字符串示例化类

fjnneemd  于 2023-09-28  发布在  其他
关注(0)|答案(4)|浏览(89)

在dart中,可以从字符串示例化一个类吗?
举例来说:

  • vanilla in JavaScript:
var myObject = window[classNameString];
  • Objective-C:
id myclass = [[NSClassFromString(@"MyClass") alloc] init];
bwleehnv

bwleehnv1#

试试看:

Map models = {"Player": Player.instantiate};
var player = models["Player"]();

class Player{
  static instantiate() => Player();
}
m1m5dgzv

m1m5dgzv2#

您需要知道库名称和类名才能使事情正常工作。假设你知道这两个,下面的例子将示例化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版本开始)。

  1. newInstance返回一个Future以允许它跨isolates工作。
pobjuy32

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',这将失败。

yeotifhr

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});

再一次,在整个项目中进行克隆是过于简单和繁琐的,但它适用于简单的情况。

相关问题