2017-01-20 4 views
1

analyzerパッケージのクラスDartTypeを使用して要素のサブタイプを取得するにはどうすればよいですか?`analyzer`パッケージから` DartType`を使ってジェネリック型のサブタイプを取得するには?

たとえば、タイプがList<String>の場合、Stringを取得します。タイプがgenericである場合にも便利です。

さらに複雑な例はMap<String, String>です。ここではサブタイプのリストを取得したいと考えています。この場合は[String, String]です。

答えて

2

この1つは少しトリッキーです - DartTypeが実際に自分自身いくつかのスーパータイプを持っているので - ここにあなたが興味ます一つはParameterizedTypeです:

import 'package:analyzer/dart/element/type.dart'; 

Iterable<DartType> getGenericTypes(DartType type) { 
    return type is ParameterizedType ? type.typeArguments : const []; 
} 

私はそれがに可能かどう場合を知っているかわかりませんタイプは一般的です - 結局のところ、それはただのタイプです。タイプは再び、汎用パラメータを受け入れる場合しかし、あなたはClassElementを使用して、チェックすることができます役立ちます

import 'package:analyzer/dart/element/element.dart'; 
import 'package:analyzer/dart/element/type.dart'; 

bool canHaveGenerics(DartType type) { 
    final element = type.element; 
    if (element is ClassElement) { 
    return element.typeParameters.isNotEmpty; 
    } 
    return false; 
} 

希望を!

関連する問題