如何在Dart中制作动态吸气剂/吸气剂

DigitalFiz

我正在尝试重新创建djangos QueryDict功能,并创建一个可以给定Map的对象,它是该对象中的私有变量,而getters / setters用于动态地从地图中提取。我设法重新创建了它的get()方法,但是我迷失于动态地获取价值。这是我到目前为止的内容:

class QueryMap {
  Map _data;

  QueryMap(Map this._data);

  dynamic get(String key, [var defaultValue]) {
    if(this._data.containsKey(key)) {
      return this._data[key];
    } else if(defaultValue) {
      return defaultValue;
    } else {
      return null;
    }
  }
}

这是有关它如何工作的djangos页面:https ://docs.djangoproject.com/en/dev/ref/request-response/#django.http.QueryDict getitem

年份

您可以覆盖noSuchMethod模拟功能

@proxy
class QueryMap {
  Map _data = new Map();

  QueryMap();

  noSuchMethod(Invocation invocation) {
    if (invocation.isGetter) {
      var ret = _data[invocation.memberName.toString()];
      if (ret != null) {
        return ret;
      } else {
        super.noSuchMethod(invocation);
      }
    }
    if (invocation.isSetter) {
      _data[invocation.memberName.toString().replaceAll('=', '')] =
          invocation.positionalArguments.first;
    } else {
      super.noSuchMethod(invocation);
    }
  }
}
void main() {
  QueryMap qaueryMap = new QueryMap();
  qaueryMap.greet = "Hello Dart!";
  print(qaueryMap.greet); //Hello Dart!
}

正如@PixelElephant在使用外部映射时所指出的那样,您必须使用真实的方法名称作为映射键:

import 'dart:mirrors';
@proxy
class QueryMap {
  Map _data;

  QueryMap(this._data);

  noSuchMethod(Invocation invocation) {
    if (invocation.isGetter) {
      var ret = _data[MirrorSystem.getName(invocation.memberName)];
      if (ret != null) {
        return ret;
      } else {
        super.noSuchMethod(invocation);
      }
    }
    if (invocation.isSetter) {
      _data[MirrorSystem.getName(invocation.memberName).replaceAll('=', '')] =
          invocation.positionalArguments.first;
    } else {
      super.noSuchMethod(invocation);
    }
  }
}
void main() {
  Map myMap = new Map();
  myMap["color"] = "red";
  QueryMap qaueryMap = new QueryMap(myMap);
  qaueryMap.greet = "Hello Dart!";
  print(qaueryMap.greet); //Hello Dart!
  print(qaueryMap.color); //red
}

为了避免使用镜像,您可以在符号的字符串序列化或转换外部映射键时进行模式匹配:

@proxy
class QueryMap {
  Map _data;

  QueryMap(Map data) {
    _data = new Map();
    data.forEach((k, v) => _data[new Symbol(k).toString()] = v);
  }

  noSuchMethod(Invocation invocation) {
    if (invocation.isGetter) {
      var ret = _data[invocation.memberName.toString()];
      if (ret != null) {
        return ret;
      } else {
        super.noSuchMethod(invocation);
      }
    }
    if (invocation.isSetter) {
      _data[invocation.memberName.toString().replaceAll('=', '')] =
          invocation.positionalArguments.first;
    } else {
      super.noSuchMethod(invocation);
    }
  }
}
void main() {
  Map myMap = new Map();
  myMap["color"] = "red";
  QueryMap qaueryMap = new QueryMap(myMap);
  qaueryMap.greet = "Hello Dart!";
  print(qaueryMap.greet); //Hello Dart!
  print(qaueryMap.color); //red
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何修复Dart中的吸气剂返回“ null”?

来自分类Dev

定义在Dart中接受参数的吸气剂

来自分类Dev

如何在vuex nuxt中获取嵌套的吸气剂

来自分类Dev

如何在Javascript中获得计算的吸气剂名称?

来自分类Dev

Nuxt-如何在全局mixins中调用吸气剂?

来自分类Dev

如何嘲笑私人吸气剂?

来自分类Dev

该课程中吸气剂/吸气剂的目的

来自分类Dev

使用Dart中的反射从ClassMirror获取吸气剂和/或属性?

来自分类Dev

向原型添加吸气剂/吸气剂

来自分类Dev

在不模拟的情况下测试调用另一个吸气剂的吸气剂-或如何在测试中安装Vuex?

来自分类Dev

引用代替吸气剂?

来自分类Dev

飞镖:@observable的吸气剂

来自分类Dev

Spritekit上的吸气剂

来自分类Dev

吸气剂返回null

来自分类Dev

如何在PMD CommentRequired规则中忽略吸气剂/阻焊剂?

来自分类Dev

如何向对象添加吸气剂

来自分类Dev

如何使用可为空的吸气剂?

来自分类Dev

如何覆盖符合KVO的属性的吸气剂?

来自分类Dev

您如何从吸气剂设置值?

来自分类Dev

如何优化此吸气剂性能问题?

来自分类Dev

如何向对象添加吸气剂

来自分类Dev

如何在带点的属性上使用Ember的吸气剂/设置剂?

来自分类Dev

如何在带有点的属性上使用Ember的吸气剂/设定剂?

来自分类Dev

卸载boostrap插件中的懒惰吸气剂?

来自分类Dev

卸载boostrap插件中的懒惰吸气剂?

来自分类Dev

JavaScript 中的私有 (#) 吸气剂

来自分类Dev

List.Add()在C#中不起作用-吸气剂和吸气剂问题?

来自分类Dev

List.Add()在C#中不起作用-吸气剂和吸气剂问题?

来自分类Dev

打字稿声明文件中是否可能有吸气剂和吸气剂?

Related 相关文章

热门标签

归档