在Dart中获取通用列表的子类型

时间:2018-10-11 04:05:43

标签: dart

如何获取Dart中泛型类型的列表的子类型。
例如:

T is List< String > => String

T is List< SomeObject > => SomeObject

我已经研究了这个问题,但是我发现了一些解决方法。
关于这个问题有什么建议吗?谢谢你。

3 个答案:

答案 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的类型。