从字符串中实例化一个类

问题描述 投票:9回答:3

在dart中是否可以从字符串中实例化一个类?

例如:

  • javascript中的香草:
var myObject = window[classNameString];
  • Objective-C的:
id myclass = [[NSClassFromString(@"MyClass") alloc] init];
dart dart-mirrors
3个回答
4
投票

您需要知道库名称和类名称才能使其正常工作。假设您都知道,下面的示例将实例化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中导入,这使得这种情况更容易一些。
  2. 调用newInstance允许将参数传递给构造函数。实现了位置参数,但尚未实现命名参数(从M2版本开始)。
  3. newInstance返回Future以允许它在isolates上工作。

4
投票

语法已更改。我这样做了

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


0
投票

这是一个困扰我的问题,直到我认为我可以实现一个粗略的方法来处理编码的Json对象/字符串或Dart映射到所需类的转换。

下面是一个简单的例子,它也处理空值并接受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});

再一次,这在整个项目中克隆是简单而乏味的,但它适用于简单的情况。

© www.soinside.com 2019 - 2024. All rights reserved.