解释问题的示例代码。
import "dart:mirrors";
void main() {
var type = getTypeFromDeclaration();
var typeArguments = getAnotherTypeArguments();
var myType = reflectType(type, typeArguments);
}
如何通过反射来获取具有指定类型参数的类型镜像?
P.S。
我认为我不需要解释“为什么需要这个?”因为我们都知道数据水合所需的这种功能。
这在使用反射以获得更好的数据一致性的数据编解码器中非常有用。
正如您所注意到的,我不会解释原因。
答案 0 :(得分:2)
首先,我同意,如果镜像系统允许从Foo和Bar的类型镜像以及Map的类镜像创建Map的类型镜像,那将是最好的。目前情况并非如此。
没有它,我认为你不能像写的那样解决问题。 无法在编译时创建带有作为类型的类型参数的参数化类型。
为了完整性,如果您在编译时知道类型,我将提供一种反映参数化类型的方法。如果类型参数可以表示为Type对象或TypeMirror对象以外的其他参数,则可以构建自己的表示,允许这样的操作。
如果您不能使用reflectType(Map<Foo,Baz>)
,因为Map<Foo,Baz>
不是有效的类型文字,那么为任何类型获取Type都有一个小的解决方法:拥有一个带有类型参数的类,获取该参数的Type值的方法。
import "dart:mirrors";
class Typer<T> { Type get type => T; }
main() {
var mapStringInt = reflectType(new Typer<Map<String,int>>().type);
print(mapStringInt); // ClassMirror on 'Map'
print(mapStringInt.typeArguments); // [ClassMirror on 'String', ClassMirror on 'int']
// That is: it's a TypeMirror on Map<String,int>.
}