dart - 如何动态创建新的类实例对象

标签 dart dart-mirrors

我有一个类

    class Account extends Stuff{
      String name;
      newObject(){
        return new Account();
      }
    }

在Stuff类中,我有一个方法

    //generates list of objects of the same type 
    //as given object and fills attribute 
    generateObjectsFromExisting(names)
      {
        List list = new List();
        InstanceMirror instanceMirror = reflect(this);
        Symbol formatSymbol = new Symbol("newObject");
        for(var name in names){
          //calles newObject function from this and returns a new object
          var newInstanceObject = instanceMirror.invoke(formatSymbol, []);
          Symbol symbol = new Symbol("name");
          InstanceMirror field = newInstanceObject.setField(symbol,name);
          list.add(newInstanceObject.reflectee)
        }
        return list;
      }

所以写的时候

    main(){
      var account = new Account();
      List accounts = new List();
      accounts = account.generateObjectsFromExisting(['tim','tom']);
      print(account.name) // returns null
      print(accounts[0].name) // returns tim
      print(accounts[1].name) // returns tom
    }

这种方式的问题是

1'generateObjectsFromExisting()'在'account'对象上,而不在Account上

2我必须手动将“newObject”方法添加到我实现的每个类中。

我更喜欢静态方法,例如'Account.generateObjectsFromExisting()'
但是如何访问“this”(因为它在静态中不可用)
所以我可以说“this.new()”或等同于“new Account();”的东西例如“new this();”
因此在Stuff中只能有一个'newObject'函数,或者根本不需要它。

所以现在我的代码看起来像这样

    class Account extends Stuff{
      String name;
    }

在东西

    static generateObjectsFromExisting(names)
      {
        List list = new List();
        for(var name in names){
          var object = new this();
          object.name = name;
          list.add(object)
        }
        return list;
      }

在主要

    main(){
      // returns list of Accounts filled with names
      accounts = Account.generateObjectsFromExisting(['tim','tom']);
      print(accounts[0].name) // returns tim
      print(accounts[1].name) // returns tom
    }

如果您可以向我展示一种访问Class的方法来执行类似this.new();的操作,或新this();那么显然需要访问“帐户”类,而不是扩展的“内容”

如果无法使用“这种”方法,那么也许您可以向我展示一种如何从现有对象中访问类的方法

喜欢

    generateObjectsFromExisting(names)
      {
        List list = new List();
        var class = this.class;
        var newObject = class.new():
        ...          
      }

还是我当前的方法是唯一的解决方案。 .. 希望不是 :)

谢谢

最佳答案

目前,我可以想到两种方式。但是它们都非常接近您的初始解决方案,因为它们都使用反射。

非静态解决方案:

class Stuff {

  generateObjectsFromExisting(List<String> names) {
    var cm = reflectClass(this.runtimeType);
    return names.map((name) {
      var newInstance = cm.newInstance(const Symbol(''), []).reflectee;
      newInstance.name = name;
      return newInstance;
    }).toList();
  }
}

静态解决方案:

class Stuff {

  static generateObjectsFromExisting(type, List<String> names) {
    var cm = reflectClass(type);
    return names.map((name) {
      var newInstance = cm.newInstance(const Symbol(''), []).reflectee;
      newInstance.name = name;
      return newInstance;
    }).toList();
  }
}

您将这样调用静态解决方案:

var accounts = Stuff.generateObjectsFromExisting(Account, ['tim', 'tom']);

可能还有另一种涉及工厂构造函数的解决方案,但现在还没有想到。同样,当您获得另一个没有Stuff属性的name子类时,此代码也很容易中断。我不知道您是否真的打算将该属性放在Account而不是Stuff上。

还回答您的“类(class)”问题。 Dart中没有类,只有Type,要获取它,您可以执行以下操作:

Type type1 = Account;
Type type2 = account.runtimeType;

但是Type没有任何可用于创建新实例的方法。

关于dart - 如何动态创建新的类实例对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19937317/

相关文章:

dart - Dart 镜像行为是否保证不允许从其他库调用私有(private)方法并且是规范的一部分?

dart - 如何在 Dart 中获取一个类的所有字段?

dart - 是否可以通过名称获取类镜像?

firebase - 如何在服务器端访问dart中的firestore

dart - 使用Reflectable开发库时要声明哪些转换器?

json - 使用镜像后,dart项目的发布构建失败

dart - Flutter - 创建自己的 snackbar 设计

dart - Dart 中有任何类型的事件支持吗?

xmlhttprequest - 从 Dart 客户端到本地 Dart docker 服务器的 HTTP 请求上出现“XMLHttpRequest 无法加载”错误

user-interface - flutter 如何创建具有以下内容的容器,以及如何在窗口小部件/容器内部绘制自定义边框