我正在尝试重新创建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] 删除。
我来说两句