86796


こんにちは、Dartで以下のような実装が可能か教えて下さい。

Dartで型判定を行う際には「is」を使用する方法がありますが、  
この「is」の右辺を動的な変数として置くことは可能でしょうか。

例えば以下のような場合です。

[code]

    void main() {
      final parameter = FormatException();
      final exceptions = [Exception];
    
      // これはできる
      print(parameter is Exception);
    
      for (final exception in exceptions) {
        // 構文エラー
        print(parameter is exception);
      }
    }
    
[/code]

私の実装に必要なのはまさに構文エラーが出る「print(parameter is exception);」の部分で、  
代替案があれば教えていただきたく思います。

よろしくお願いします。

== 以下追記 ==

この処理を必要とする理由を聞かれましたので、  
以下のように回答します。

現在とあるフレームワークを作成していまして、  
上記の例にあるような形式でユーザーが指定した複数の例外の型を基にして、  
実際に処理中で例外が発生した場合に指定された例外であれば処理をスキップする処理を追加しようとしています。

そうなりますと先に挙げた構文エラーになる例のように  
ユーザーが指定した例外の型と処理中で発生した例外と比較する必要があります。

現状はどうしてもDart言語の仕様上「is」では構文エラーになるので文字列に直して比較していますが、  
この比較方法では例えばFormatExceptionがExceptionの子供だということがわかりません。

そのため、今回の問題を解決する手段がDartにあるか質問させていただきました。


CC BY-SA 4.0
2022-03-10T06:19:46.783
86779
2022-03-11T05:11:28.487
2022-03-10T08:26:22.657
51316
51316
question
flutter dart
動的に型判定を行いたい


## エラーが出ている理由

Dart 2.15 の時点で、`e is T` 形式の演算子では `T`
の部分に具体的な型が要求されており、かつ、ここに値レベルの式を書いても評価されません。`parameter is exception` と書いたときに
`The name 'exception' isn't defined, so it can't be used in an 'is'
expression.` というエラーになるのはこのためで、`exception` という名前の型を探しにいって見つからないのでエラーになっています。

この仕様は仕様書の "Type Test" のところに書かれています <https://dart.dev/guides/language/spec>

## 部分的な解決案

ワークアラウンドとして、`runtimeType` と値として比較する方法はあります。

[code]

    parameter.runtimeType == exception
    
[/code]

ただしこの方法でも部分型関係は表現できません。また Dart Tour では `runtimeType` の利用は非推奨になっています

> In production environments, the test `object is Type` is more stable than
> the test `object.runtimeType == Type`.

<https://dart.dev/guides/language/language-tour#getting-an-objects-type>

もし比較対象の型が関数引数か何かに渡されてくる想定なのであれば、少なくとも type test を使った検査は現状できないはずです。

悩みますが、可能なのであれば、例外の方を渡してもらうのではなくて、例外側は固定して、例外を投げるべき場面でその例外を投げるようにしてもらう方が簡単かもしれません（ここについてはちょっと自信がありません）。


CC BY-SA 4.0
2022-03-11T05:11:28.487
86796
2022-03-11T05:11:28.487
19110
86779
answer