如何获取Dart中泛型类型的列表的子类型。
例如:
T is List< String > => String
T is List< SomeObject > => SomeObject
我已经研究了这个问题,但是我发现了一些解决方法。
关于这个问题有什么建议吗?谢谢你。
答案 0 :(得分:3)
无法在运行时获取列表的实际类型参数作为类型。
如果类本身不提供Dart,则Dart无法解构类型List<X>
以获得X
。
如果dart:mirrors
可用,则可以使用它来作为Type
对象的类型,这在这种情况下就足够了,但是Flutter中没有镜像。
答案 1 :(得分:2)
您可以使用以下函数获取列表的类型参数:
Type typeOfElementsInList<T>(List<T> e) => T;
main() {
print(typeOfElementsInList([])); // dynamic
print(typeOfElementsInList(<int>[])); // int
print(typeOfElementsInList(['test'])); // String
}
答案 2 :(得分:0)
为仍在搜索此内容的任何人提供最新的更新:
在Dart 2.7中,您可以使用扩展方法来实现此目标:
// extensions/list.dart
extension Typing<T> on List<T> {
/// Provide access to the generic type at runtime.
Type get genericType => T;
}
https://dart.dev/guides/language/extension-methods#implementing-generic-extensions
然后,您可以通过导入并像使用其他List
函数一样使用它来使用它:
import './extensions/list.dart';
List<String> myList = ['some', 'strings'];
print('Your List type is ${myList.genericType}!');
这与警告一起工作,即它返回声明的类型T
,因此,如果这是运行时类型的超类,则您仍然只能获得首先声明的List
的类型。