【问题标题】:Create an instance of an object from a String in Dart?从 Dart 中的字符串创建对象的实例?
【发布时间】:2013-06-15 09:20:59
【问题描述】:

我将如何执行此 Java 代码的 Dart 等效项?

Class<?> c = Class.forName("mypackage.MyClass");
Constructor<?> cons = c.getConstructor(String.class);
Object object = cons.newInstance("MyAttributeValue");

(来自杰夫·加德纳)

【问题讨论】:

    标签: dart dart-mirrors


    【解决方案1】:

    飞镖代码:

    ClassMirror c = reflectClass(MyClass);
    InstanceMirror im = c.newInstance(const Symbol(''), ['MyAttributeValue']);
    var o = im.reflectee;
    

    从此文档了解更多信息:http://www.dartlang.org/articles/reflection-with-mirrors/

    (来自吉拉德布拉查)

    【讨论】:

    • 'first' 和 'classes' 属性不再在 LibraryMirror 上(我使用的是 30188)。你将如何使用 Dart v1 做到这一点?
    【解决方案2】:

    使用built_mirrors,您可以通过以下方式进行操作:

    library my_lib;
    
    import 'package:built_mirrors/built_mirrors.dart';
    
    part 'my_lib.g.dart';
    
    @reflectable
    class MyClass {
    
      String myAttribute;
    
      MyClass(this.myAttribute);
    }
    
    main() {
      _initMirrors();
    
      ClassMirror cm = reflectType(MyClass);
    
      var o = cm.constructors[''](['MyAttributeValue']);
    
      print("o.myAttribute: ${o.myattribute}");
    }
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-22
        • 2020-07-30
        • 1970-01-01
        • 1970-01-01
        • 2019-12-14
        • 2015-07-22
        相关资源
        最近更新 更多